JavaScript is required. Please enable it to continue.
Your browser lacks required capabilities. Please upgrade it or switch to another to continue.
Loading…
<br/> <br/> <h1 class='title'> <span class='title silhouette'>H a r d</span> <span class='title silhouette'>L i f e</span> <span class='normal tiny'>(v. <<print setup.ALIAS.gameVersion()>>)</span> <div style='font-size: 0.42em; font-weight: normal; opacity: 0.42;'>( <<print setup.ALIAS.gameVersion('full')>> )</div> </h1> <br/> <p class='sub-title'><big>select your character</big></p> <br/> <p><<print setup.ALIAS.char_select_menu()>></p>
<<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<run setup.ALIAS.doRest('sleep', 5, $G.PC); >><<set _time = setup.ALIAS.getTime();>> <<if ("05:30"<_time)&&(_time<"07:30")>> <<run setup.ALIAS.giveFeedback("You wake up at first light, but the store won't be open for another hour. What do you do?");>> <</if>> <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>>
<<if (_hrs) && (_lv)>> <<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<run setup.ALIAS.doWorkout('run', _hrs, _lv, $G.PC); >> <<replace '#datetime'>><<include 'DATETIME'>><</replace>> <p><<print setup.ALIAS.descMissing('RUN DISTANCE');>></p> <p></p> <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>> <<else>> <<print setup.ALIAS.workoutTable('run', null, null, $G.PC); >> <p class='keypress' key='[SPACE]'>[[RETURN->GO HOME]]</p> <</if>>
<<print setup.ALIAS.setupPassage();>><<print setup.ENCOUNTERS[_encounter].beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENCOUNTERS[_encounter].replacePassage(); >><<else>> <<run setup.ALIAS.doExplore('search', 20/60, $G.PC); >> <<set _found to setup.ALIAS.findChange(30, 300, true, $G.PC) >> <<set $G.PC.MATRIX.money += _found>> <<replace '#datetime'>><<include 'DATETIME'>><</replace>> <p>You find $$ <<print _found.toFixed(2)>> as you wander around the parking lot.</p> <</if>> <<print setup.ENCOUNTERS[_encounter].afterPassage();>> <p></p> <p></p> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>> <<print setup.ALIAS.exitPassage();>>
<<set _time=setup.ALIAS.getTime('24'); >> <<replace '#datetime'>><<include 'DATETIME'>><</replace>> <<if (_time>'06:59')&&(_time<'23:59') >> <<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<run setup.ALIAS.addMinutes(5); >> <<replace '#datetime'>> <<include 'DATETIME'>><</replace>> <p class='narrow'>What did you wish to do?</p> <p></p> <p class='narrow keypress' key='1'>[[CHECKOUT APPAREL]]</p> <p class='narrow keypress' key='2'>[[CHECKOUT AUTOMOTIVE]]</p> <p class='narrow keypress' key='3'>[[CHECKOUT ELECTRONICS]]</p> <p class='narrow keypress' key='4'>[[CHECKOUT FURNITURE]]</p> <p class='narrow keypress' key='5'>[[CHECKOUT GROCERY]]</p> <p class='narrow keypress' key='6'>[[CHECKOUT GARDEN]]</p> <p class='narrow keypress' key='7'>[[CHECKOUT HARDWARE]]</p> <p class='narrow keypress' key='8'>[[CHECKOUT HOUSEHOLD]]</p> <p class='narrow keypress' key='9'>[[CHECKOUT HYGIENE]]</p> <p class='narrow keypress' key='0'>[[CHECKOUT OFFICE]]</p> <p class='narrow keypress' key='-'>[[CHECKOUT PHARMACY]]</p> <p class='narrow keypress' key='='>[[CHECKOUT SPORTING GOODS]]</p> <p class='narrow'>[[CHECKOUT SEASONAL]]</p> <p></p> <p class='narrow'>[[ENTER BATHROOM]]</p> <p class='narrow'>[[FILLOUT APPLICATION]]</p> <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>> <<else>> <<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <p>You see a sign that reads, "SORRY, WE'RE CLOSED RIGHT NOW. PLEASE COME BACK AFTER 07:00 AM".</p> <p>What do you do?</p> <div><<print setup.ALIAS.exitPassage();>></div> <</if>> <</if>>
<<run setup.ALIAS.do_status_update(($G ? $G.PC : $GAMEDATA.PC));>> <<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>> <<print setup.ALIAS.replacePassage();>> <<link 'RETURN'>><<goto "GO HOME">><</link>> <<else>> <<replace '#datetime'>><<include 'DATETIME'>><</replace>> <<replace '#quick_menu'>><<include 'MENU'>><</replace>> <<replace '#feedback'>><<include 'FEEDBACK'>><</replace>> <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>> <<print setup.ALIAS.exitPassage();>>
<<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<set _max_workout = Math.max(0, setup.ALIAS.maxHours('TRAIN', $G.PC.STATE.lastExercise, 2.0, $G.PC))>> <<set _minutes = (_max_workout * 60).toFixed(1)>> <<run setup.ALIAS.doWorkout($G.PC.STATE.lastExercise, _max_workout, 2.0, $G.PC); >> <<run setup.ALIAS.doRest("sleep", 10/60, $G.PC); >> <<replace '#datetime'>><<include 'DATETIME'>><</replace>> <p>Gritting your teeth you push through the pain and keep going until you pass out. (after _minutes minutes)</p> <p>Some time later, you come to.</p> <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>>
<div class='left framed'> <p>ACTIONS</p> <p>What will you do today?</p> <p></p> <<include "ACTIONS CAR">> <p></p> <<include "ACTIONS PARKING LOT">> <p></p> <p></p> <<print setup.ALIAS.menuList_long(); >> </div>
Double-click this passage to edit it.
Double-click this passage to edit it.
<<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<set _dept = "D01">><<include 'LIST AISLES FOR DEPT'>> <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>>
<<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<set _dept = "D02">><<include 'LIST AISLES FOR DEPT'>> <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>>
<<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<set _dept = "D03">><<include 'LIST AISLES FOR DEPT'>> <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>>
<<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<set _dept = "D04">><<include 'LIST AISLES FOR DEPT'>> <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>>
<<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<set _dept = "D05">><<include 'LIST AISLES FOR DEPT'>> <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>>
<<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<set _dept = "D07">><<include 'LIST AISLES FOR DEPT'>> <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>>
<<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<set _dept = "D08">><<include 'LIST AISLES FOR DEPT'>> <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>>
<<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<set _dept = "D11">><<include 'LIST AISLES FOR DEPT'>> <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>>
<<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<set _dept = "D13">><<include 'LIST AISLES FOR DEPT'>> <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>>
<<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <p>You ask for an application and are immediately told they are under a hiring freeze.</p> <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>>
<<run Config.passages.nobr = true;>> <<include "GAME DATA">> <<replace '#title'>><<include 'TITLE'>><</replace>> <<replace '#datetime'>><<include 'DATETIME'>><</replace>> <<replace '#feedback'>><<include 'FEEDBACK'>><</replace>> <<run setup.ALIAS.menuHide();>> <<run setup.ALIAS.dialog_hide();>>
<div class='left framed'> <h4>RESOURCES</h4> <div class='resources'> <<print setup.ALIAS.getResource('kcal', $G.PC) >> <<print setup.ALIAS.getResource('protein', $G.PC) >> <<print setup.ALIAS.getResource('sugar', $G.PC) >> <p></p> <<print setup.ALIAS.getResource('petro', $G.PC) >> <<print setup.ALIAS.getResource('money', $G.PC) >> <p></p> <<print setup.ALIAS.getResource('light', $G.PC) >> <<print setup.ALIAS.getResource('dark', $G.PC) >> <<print setup.ALIAS.getResource('qi', $G.PC) >> <p></p> <<if settings.lod_energyMatrix>> <div class='energy-matrix half-glass'> <<print setup.ALIAS.getResource('vigor', $G.PC) >> <<print setup.ALIAS.getResource('train', $G.PC) >> <<print setup.ALIAS.getResource('tough', $G.PC) >> <<print setup.ALIAS.getResource('power', $G.PC) >> <<print setup.ALIAS.getResource('skill', $G.PC) >> <<print setup.ALIAS.getResource('aware', $G.PC) >> <<print setup.ALIAS.getResource('vital', $G.PC) >> <<print setup.ALIAS.getResource('metab', $G.PC) >> <<print setup.ALIAS.getResource('focus', $G.PC) >> <<print setup.ALIAS.getResource('guard', $G.PC) >> <<print setup.ALIAS.getResource('react', $G.PC) >> <<print setup.ALIAS.getResource('psych', $G.PC) >> <<print setup.ALIAS.getResource('regen', $G.PC) >> <<print setup.ALIAS.getResource('force', $G.PC) >> <<print setup.ALIAS.getResource('fight', $G.PC) >> </div> <</if>> </div> </div>
<<set _S = setup.ALIAS.statGet('all', 'current', $G.PC);>> <div class='left framed'> <h4>STATS / METRICS</h4> <table class='stats'> <tr> <th><<print setup.ALIAS.karmic_link('STR', $G.PC)>>:</th> <th><<print setup.ALIAS.statPrint('STR', $G.PC); >></th> </tr> <tr> <th><<print setup.ALIAS.karmic_link('PHY', $G.PC)>>:</th> <th><<print setup.ALIAS.statPrint('PHY', $G.PC); >></th> </tr> <tr> <th><<print setup.ALIAS.karmic_link('WSD', $G.PC)>>:</th> <th><<print setup.ALIAS.statPrint('WSD', $G.PC); >></th> </tr> <tr> <th><<print setup.ALIAS.karmic_link('END', $G.PC)>>:</th> <th><<print setup.ALIAS.statPrint('END', $G.PC); >></th> </tr> <tr> <th><<print setup.ALIAS.karmic_link('SPD', $G.PC)>>:</th> <th><<print setup.ALIAS.statPrint('SPD', $G.PC); >></th> </tr> <tr> <th><<print setup.ALIAS.karmic_link('INS', $G.PC)>>:</th> <th><<print setup.ALIAS.statPrint('INS', $G.PC); >></th> </tr> <tr class='spacer'><td colspan='2'><hr /></td></tr> <tr style='font-size: 0.75em'> <td>lv [cal]:</td> <td><<print (_S.level).toFixed(0)+" ["+(_S.caliber).toFixed(0)+"]">></td> </tr> <tr class='spacer'><td colspan='2'><hr /></td></tr> <tr> <td>age:</td> <td><<print setup.ALIAS.char_metric('age', $G.PC)>></td> </tr> <tr> <td><<print setup.ALIAS.karmic_link('height', $G.PC)>>:</td> <td><<print setup.ALIAS.char_metric('ht', $G.PC)>></td> </tr> <tr> <td><<print setup.ALIAS.karmic_link('weight', $G.PC)>>:</td> <td><<print setup.ALIAS.char_metric('wt', $G.PC)>></td> </tr> <tr> <td>BMI:</td> <td><<print setup.ALIAS.char_metric('BMI', $G.PC)>></td> </tr> <tr> <td>Tone %:</td> <td><<print setup.ALIAS.char_metric('bodytone', $G.PC)>></td> </tr> <tr> <td>Fat %:</td> <td><<print setup.ALIAS.char_metric('bodyfat', $G.PC)>></td> </tr> <tr class='spacer'><td colspan='2'><hr /></td></tr> <tr> <td>bicep:</td> <td><<print setup.ALIAS.char_metric('bicep', $G.PC)>></td> </tr> <tr> <td>quads:</td> <td><<print setup.ALIAS.char_metric('quads', $G.PC)>></td> </tr> <tr class='spacer'><td colspan='2'><hr /></td></tr> <tr> <td>chest:</td> <td><<print setup.ALIAS.char_metric('chest', $G.PC)>></td> </tr> <tr> <td><<print setup.ALIAS.karmic_link('cup', $G.PC)>>:</td> <td><<print setup.ALIAS.char_metric('cup', $G.PC)>></td> </tr> <tr> <td>waist:</td> <td><<print setup.ALIAS.char_metric('waist', $G.PC)>></td> </tr> <tr> <td>hips:</td> <td><<print setup.ALIAS.char_metric('hips', $G.PC)>></td> </tr> </table> <p></p> <div> <h4>CONDITION:</h4> <<print setup.ALIAS.listConditions($G.PC); >> </div> </div>
<<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<run setup.ALIAS.doRest('rest', 20/60, $G.PC); >> <<run setup.ALIAS.giveFeedback("You rest for a few minutes to recover your strength.");>> <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>>
<<if (_hrs) && (_lv)>> <<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<run setup.ALIAS.doWorkout('walk', _hrs, _lv, $G.PC); >> <<replace '#datetime'>><<include 'DATETIME'>><</replace>> <p><<print setup.ALIAS.descMissing('WALK DISTANCE');>></p> <p></p> <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>> <<else>> <<print setup.ALIAS.workoutTable('walk', null, null, $G.PC); >> <p class='keypress' key='[SPACE]'>[[RETURN->GO HOME]]</p> <</if>>
<<if (_hrs) && (_lv)>> <<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<run setup.ALIAS.doWorkout('jog', _hrs, _lv, $G.PC); >> <<replace '#datetime'>><<include 'DATETIME'>><</replace>> <p><<print setup.ALIAS.descMissing('WALK DISTANCE');>></p> <p></p> <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>> <<else>> <<print setup.ALIAS.workoutTable('jog', null, null, $G.PC); >> <p class='keypress' key='[SPACE]'>[[RETURN->GO HOME]]</p> <</if>>
<<if (_hrs) && (_lv)>> <<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<run setup.ALIAS.doWorkout('calisthenics', _hrs, _lv, $G.PC); >> <<replace '#datetime'>><<include 'DATETIME'>><</replace>> <p><<print setup.ALIAS.descMissing('CALISTHENIC WORKOUT');>></p> <p></p> <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>> <<else>> <<print setup.ALIAS.workoutTable('calisthenics', null, null, $G.PC); >> <p class='keypress' key='[SPACE]'>[[RETURN->GO HOME]]</p> <</if>>
<p class='keypress' key='[SPACE]'>[[CONTINUE->GO HOME]]</p> <p class='keypress' key='[ENTER]'>[[I'M NOT DONE YET!->PUSH YOURSELF]]</p>
<<nobr>> <<set $G = { /* SAVED DATA */ 'PC': { /* current character data */ }, 'CHARS':{ /* reserved for future expansion, character swapping */ }, 'WORLD':{ 'VARS':{}, /* game-world data */ }, }>> <<set setup.TEMP = {};>> <<include 'setup.SYS'>> <<include 'setup.DATA'>> <<include 'setup.FLAGS'>> <<include 'setup.MENU'>> <<include 'setup.DIALOG'>> <<include 'setup.BODY'>> <<include 'setup.TRAITS'>> <<include 'setup.STATUSES'>> <<include 'setup.ACTIONS'>> <<include 'setup.WORKOUTS'>> <<include 'setup.CHARS'>> <<include 'setup.POWERS'>> <<include 'setup.ROLES'>> <<include 'setup.AISLES'>> <<include 'setup.ENCOUNTERS'>> <<include 'setup.SITUATIONS'>> <<include 'setup.PASSAGES'>> <<include 'setup.LOCATIONS'>> <<include 'setup.PROPERTIES'>> <<include 'setup.STRUCTURES'>> <<include 'setup.ROOMS'>> <<include 'setup.DESC'>> <<include 'setup.NAMES'>> <<include 'setup.ALIAS'>> <<include 'setup.BUILD'>> <<include 'setup.SITE'>> <<include 'setup.MODS'>> <</nobr>>
<<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<set _dept = "D06">><<include 'LIST AISLES FOR DEPT'>> <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>>
<<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<set _dept = "D10">><<include 'LIST AISLES FOR DEPT'>> <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>>
<<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<set _dept = "D12">> <<if true>> <h2><<print setup.AISLES[_dept].name>></h2> <h3><<print setup.AISLES[_dept].desc>></h3> There's nothing here... try back next season. <<else>> <<include 'LIST AISLES FOR DEPT'>> <</if>> <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>>
<<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<if $G.PC.STUFF['D08_A09_I03']>> <<linkreplace "GET CLEANED UP">> <p>You pull out an old washcloth from your purse, left over from the last time you had to do this, wet it and add some hand soap. Then you go into a stall and take a quick spongebath, making several trips back to the sink to rinse the cloth.</p> <p></p> <p>Hardly elegant, but at least you don't stink.</p> <<run setup.ALIAS.depleteItem('D08_A09_I03', 1, $G.PC); $G.PC.MATRIX.regen += 10; setup.ALIAS.do_status_update($G.PC); >> <</linkreplace>> <<else>> <p>If you had another washcloth, you could get cleaned up.</p> <</if>> <p></p> <p class='narrow'><<link 'EXAMINE SELF'>><<run setup.ALIAS.menuShow('self'); >><</link>></p> <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>>
<div class='left framed'> <p>ACTIONS</p> <p>What will you do today?</p> <p></p> <<include "ACTIONS MOTEL ROOM">> <p></p> <<print setup.ALIAS.menuList_long(); >> </div>
<div class='left framed'> <p>ACTIONS</p> <p>What will you do today?</p> <p></p> <<include "ACTIONS STREET">> <p></p> <p></p> <<print setup.ALIAS.menuList_long(); >> </div>
<hr/> <<print setup.AISLES[_dept].AISLES[_aisle].name +": "+ setup.AISLES[_dept].AISLES[_aisle].desc>><br/> <<for _item_id, _item_data range setup.DATA.ITEMS>> <<if _aisle == _item_id.substr(0,7)>> <<print setup.ALIAS.itemCard(_item_id);>> <</if>> <</for>> <hr/>
<<print setup.ALIAS.getFeedback();>>
<table id="game-window"><tr> <td id="sidebar"> <table class='full'> <tr><td id="title"></td></tr> <tr><td id="quick_menu"></td></tr> <tr><td id="detail"></td></tr> </table> </td> <td id="main"> <table class='full'> <tr><td id="datetime"></td></tr> <tr><td id="feedback"></td></tr> <tr><td id="container"> <div id="passages" class="passage"></div> <div id='menu'></div> </td></tr> </table> </td> </tr></table>
<ul class='items stuff'> <<for _item_id, _uses range $G.PC.STUFF>> <<if !(("consumable"==setup.ROLES.ALL[setup.DATA.ITEMS[_item_id].role].type)||("wearable"==setup.ROLES.ALL[setup.DATA.ITEMS[_item_id].role].type)) >> <li><<print setup.DATA.ITEMS[_item_id].name +" ("+ _uses + " uses remaining)" >></li> <</if>> <</for>> </ul> <hr/> <ul class='items junk'> <<for _jid, _jname range $G.PC.JUNK>> <li><<print _jname >></li> <</for>> </ul> <p></p> <p></p> <p class='keypress' key='[ESC]'><<link 'RETURN'>><<run setup.ALIAS.menuHide();>><</link>></p>
<div class='framed'> <h3>Attire</h3> <ul class='items'> <<for _slot, _item_id range $G.PC.EQUIP>> <<if _item_id>> <li><<print " <<link '"+ _slot +": "+ setup.DATA.ITEMS[_item_id].name +"'>> <<if setup.ALIAS.removeItem( '" + _item_id + "', $G.PC )>> <<else>> <</if>> <<run setup.ALIAS.menuShow('equip');>> <</link>> ">></li> <</if>> <</for>> </ul> </div> <hr/> <hr/> <div class='framed'> <h3>Wardrobe</h3> <ul class='items'> <<for _item_id, _uses range $G.PC.STUFF>> <<if "wearable"==setup.ROLES.ALL[setup.DATA.ITEMS[_item_id].role].type >> <li><<print " <<link '"+ setup.DATA.ITEMS[_item_id].name +" ("+ _uses + " uses remaining)'>> <<if setup.ALIAS.useItem( '" + _item_id + "', 1, $G.PC, $G.PC )>> <<else>> <</if>> <<run setup.ALIAS.menuShow('equip');>> <</link>> ">></li> <</if>> <</for>> </ul> </div> <p></p> <p></p> <p></p> <p class='keypress' key='[ESC]'><<link 'RETURN'>> <<run if('GO HOME'==State.passage) { Engine.play(State.passage, true); } setup.ALIAS.menuHide(); >> <</link>></p>
<<set _open = 0; _pack = 0; if(!_SOURCE_CHAR) { _SOURCE_CHAR=$G.PC; } if(!_TARGET_CHAR) { _TARGET_CHAR=$G.PC; } >> <<for _item_id, _uses range _SOURCE_CHAR.STUFF>> <<if "consumable"==setup.ROLES.ALL[setup.DATA.ITEMS[_item_id].role].type >> <<print setup.ALIAS.wrap( setup.ALIAS.foodCard(_item_id), 'div', ('item'+(settings.lod_energyMatrix ? '-matrix' : '')+' glass'), { 'id':setup.ALIAS.CSS_safeID(_item_id), 'tabindex':'0', } );>> <</if>> <</for>> <p></p> <p></p> <p></p> <p class='keypress' key='[ESC]'><<link 'RETURN'>> <<run if('GO HOME'==State.passage) { Engine.play(State.passage, true); } setup.ALIAS.menuHide(); >> <</link>></p>
<<if ($G.PC.STATE)>><<print setup.ALIAS.getTime(); >> <<print setup.ALIAS.getLongDate(); >> (<<print setup.ALIAS.weather_getReport(); >>)<</if>>
<hr/><hr/> <ul class='side-menu'> <li class='keypress' key='[F5]'><<link "Stats & Metrics">><<replace "#detail">><<set $G.PC.STATE.detail="STATS"; >><<include "STATS" >><</replace>><</link>></li> <li class='keypress' key='[F6]'><<link "Resources" >><<replace "#detail">><<set $G.PC.STATE.detail="RESOURCES"; >><<include "RESOURCES" >><</replace>><</link>></li> <li class='keypress' key='[F7]'><<link "Energy Levels" >><<replace "#detail">><<set $G.PC.STATE.detail="ENERGY"; >><<include "ENERGY" >><</replace>><</link>></li> <hr/> <<print setup.ALIAS.menuList_short(); >> </ul> <hr/><hr/>
<a target="_blank" href='http://patreon.com/ShadowRx'>ShadowRx</a>
<h3><span class='sub-title silhouette'>H a r d </span> <span class='sub-title silhouette'> L i f e</span></h3> <small> v<<print setup.ALIAS.gameVersion()>> by<br/> <a target="_blank" href='http://patreon.com/ShadowRx'>ShadowRx</a><br/> <<set _build=setup.ALIAS.buildVersion>> <<set _mods=setup.ALIAS.modVersion>> <small>(<<print "<span class='build "+ _build +"'>"+ _build +" build</span>";>>)</small><br/> </small> <br/> <hr/> <ul class='side-menu'> <li class='keypress' key='[F1]'><<link "Guide">><<run setup.ALIAS.menuShow('guide');>><</link>></li> <li class='keypress' key='[F2]'><<link "Save/Load">><<script>>UI.saves()<</script>><</link>></li> <li class='keypress' key='[F3]'><<link "Settings">><<script>>UI.settings()<</script>><</link>></li> <li class='keypress' key=''><<link "Restart">><<script>>UI.restart()<</script>><</link>></li> </ul>
<p>You had it. You were a rising star, just finished your third small film and were about to be married to Nick James, the hottest new producer/director on the indy scene. You had <i><u>everything</u></i>. Everything you ever wanted... or so you thought.</p> <p>Then you found out your movie director fiance has slept with <u><i>every</i></u> girl on set, and someone new has caught his eye... <big><i><b>your best friend</b></i></big>.</p> <p>Nearly broke, and with no one to turn to, you go back to your old apartment only to find you've been evicted, and all your stuff is gone. Turns out the cheap bastard didn't pay the rent like he promised... not surprising, since he didn't pay you either.</p> <p>Looks like you'll be living out of your car again; you thought those days were behind you.</p> <p>Well, first thing's first, you step out into the chilly autumn air and put your last $20 in the gas tank. You have about $3 in coins in the cup holder, but you should probably save that for diner tomorrow.</p> <p>You spend half the night looking for somewhere to park. The best you find is a dingy old S-Mart parking lot, with half the lights burned out, but at least they didn't run you off.</p> <<run setup.ALIAS.setTime(1,1)>> <p>It's gonna be a long day tomorrow, perhaps you should <span class='keypress' key='[SPACE]'>[[turn in->SLEEP IN CAR]]</span>.</p>
<div class='dialog'> <p>Spend _cost Karma to raise base _label by _amt? _hint</p> <b> <span class='keypress' key='[ENTER]'> <<link 'YES'>> <<run setup.ALIAS.karmaAdd(-_cost, $G.PC); $G.PC[_type][_stat] += _amt; setup.ALIAS.do_status_update($G.PC); if('GO HOME'==State.passage) { Engine.play(State.passage, true); } setup.ALIAS.menuHide(); >> <</link>> </span> / <span class='keypress' key='[ESC]'><<link 'NO'>><<run setup.ALIAS.menuHide();>><</link>></span> </b> </div>
<p class='wide'>If only you had a proper mirror to use...</p> <<print setup.ALIAS.char_appearance($G.PC);>> <p></p> <p></p> <p></p> <p class='keypress' key='[ESC]'><<link 'RETURN'>><<run setup.ALIAS.menuHide();>><</link>></p>
<<set setup.DATA.ITEMS={ 'D01_A01_I02': {'name': "hair ties", 'cost': 2.00, 'uses': 100, 'role': "hairstyle", 'MATRIX':{} }, 'D01_A01_I03': {'name': "watch", 'cost': 20.00, 'uses': 500, 'role': "bracelet", 'MATRIX':{} }, 'D01_A02_I01': {'name': "azure sportsbra", 'cost': 16.00, 'uses': 100, 'role': "undershirt", 'MATRIX':{} }, 'D01_A02_I02': {'name': "furry blue leg warmers", 'cost': 20.00, 'uses': 100, 'role': "socks", 'MATRIX':{} }, 'D01_A02_I03': {'name': "pink metallic spandex leotard", 'cost': 30.00, 'uses': 100, 'role': "onepiece", 'MATRIX':{} }, 'D01_A02_I04': {'name': "purple nylon unitard", 'cost': 40.00, 'uses': 100, 'role': "onepiece", 'MATRIX':{} }, 'D01_A04_I01': {'name': "gray hoodie", 'cost': 10.00, 'uses': 500, 'role': "jacket", 'MATRIX':{} }, 'D01_A04_I02': {'name': "vest", 'cost': 20.00, 'uses': 500, 'role': "vest", 'MATRIX':{} }, 'D01_A04_I03': {'name': "winter-coat", 'cost': 60.00, 'uses': 500, 'role': "coat", 'MATRIX':{} }, 'D01_A05_I01': {'name': "black miniskirt", 'cost': 30.00, 'uses': 500, 'role': "skirt", 'MATRIX':{} }, 'D01_A05_I02': {'name': "sexy red dress", 'cost': 70.00, 'uses': 500, 'role': "dress", 'MATRIX':{} }, 'D01_A05_I03': {'name': "simple black dress", 'cost': 50.00, 'uses': 500, 'role': "dress", 'MATRIX':{} }, 'D01_A07_I01': {'name': "baseball cap", 'cost': 10.00, 'uses': 100, 'role': "hat", 'MATRIX':{} }, 'D01_A07_I02': {'name': "beanie", 'cost': 5.00, 'uses': 100, 'role': "hat", 'MATRIX':{} }, 'D01_A07_I03': {'name': "black fedora", 'cost': 45.00, 'uses': 100, 'role': "hat", 'MATRIX':{} }, 'D01_A07_I04': {'name': "fuzzy earmuffs", 'cost': 15.00, 'uses': 100, 'role': "headband", 'MATRIX':{} }, 'D01_A07_I05': {'name': "overpriced shades", 'cost': 190.00, 'uses': 100, 'role': "glasses", 'MATRIX':{} }, 'D01_A07_I06': {'name': "pink headband", 'cost': 2.00, 'uses': 100, 'role': "headband", 'MATRIX':{} }, 'D01_A07_I07': {'name': "stylish readers", 'cost': 10.00, 'uses': 100, 'role': "glasses", 'MATRIX':{} }, 'D01_A07_I08': {'name': "white ski mask", 'cost': 5.00, 'uses': 100, 'role': "mask", 'MATRIX':{} }, 'D01_A08_I01': {'name': "pearl earrings", 'cost': 25.00, 'uses': 200, 'role': "earrings", 'MATRIX':{} }, 'D01_A08_I02': {'name': "silver belly chain", 'cost': 15.00, 'uses': 200, 'role': "sash", 'MATRIX':{} }, 'D01_A08_I03': {'name': "silver garnet ring", 'cost': 20.00, 'uses': 200, 'role': "ring", 'MATRIX':{} }, 'D01_A08_I04': {'name': "silver quartz bracelet", 'cost': 45.00, 'uses': 200, 'role': "bracelet", 'MATRIX':{} }, 'D01_A08_I05': {'name': "sapphire pendant", 'cost': 430.00, 'uses': 200, 'role': "necklace", 'MATRIX':{} }, 'D01_A08_I06': {'name': "topaz necklace", 'cost': 280.00, 'uses': 200, 'role': "necklace", 'MATRIX':{} }, 'D01_A09_I01': {'name': "daisy dukes", 'cost': 45.00, 'uses': 100, 'role': "shorts", 'MATRIX':{} }, 'D01_A09_I02': {'name': "jeans", 'cost': 20.00, 'uses': 100, 'role': "pants", 'MATRIX':{} }, 'D01_A09_I03': {'name': "sweat-pants", 'cost': 10.00, 'uses': 100, 'role': "pants", 'MATRIX':{} }, 'D01_A10_I01': {'name': "blouse", 'cost': 30.00, 'uses': 100, 'role': "overshirt", 'MATRIX':{} }, 'D01_A10_I02': {'name': "colored t-shirt", 'cost': 9.00, 'uses': 100, 'role': "shirt", 'MATRIX':{} }, 'D01_A10_I03': {'name': "white undershirt 3pk", 'cost': 6.00, 'uses': 180, 'role': "undershirt", 'MATRIX':{} }, 'D01_A11_I01': {'name': "black loafers", 'cost': 40.00, 'uses': 200, 'role': "shoes", 'MATRIX':{} }, 'D01_A11_I02': {'name': "red pumps", 'cost': 30.00, 'uses': 200, 'role': "shoes", 'MATRIX':{} }, 'D01_A11_I03': {'name': "white sneakers", 'cost': 50.00, 'uses': 200, 'role': "shoes", 'MATRIX':{} }, 'D01_A12_I02': {'name': "hot pink bikini top", 'cost': 20.00, 'uses': 50, 'role': "panties", 'MATRIX':{} }, 'D01_A12_I02': {'name': "hot pink bikini thong", 'cost': 20.00, 'uses': 50, 'role': "panties", 'MATRIX':{} }, 'D01_A13_I01': {'name': "ankle socks 10pk", 'cost': 6.00, 'uses': 200, 'role': "socks", 'MATRIX':{} }, 'D01_A13_I02': {'name': "plain white bra", 'cost': 10.00, 'uses': 50, 'role': "bra", 'MATRIX':{} }, 'D01_A13_I03': {'name': "plain white panties", 'cost': 10.00, 'uses': 50, 'role': "panties", 'MATRIX':{} }, 'D01_A13_I04': {'name': "red thong", 'cost': 20.00, 'uses': 50, 'role': "panties", 'MATRIX':{} }, 'D01_A13_I05': {'name': "sheer pantyhose 3pk", 'cost': 9.00, 'uses': 42, 'role': "socks", 'MATRIX':{} }, 'D02_A02_I02': {'name': "oil", 'cost': 2.95, 'uses': 1, 'role': "engine oil", 'MATRIX':{} }, 'D05_A04_I01': {'name': "4 pack energy drink", 'cost': 6.00, 'uses': 4, 'role': "drink", 'MATRIX':{'tough': 0.00, 'power': 0.00, 'vigor': 15.00, 'skill': -1.00, 'train': -1.00, 'regen': 3.00, 'vital': 1.20, 'force': 15.00, 'guard': 9.00, 'metab': 21.00, 'fight': 18.00, 'react': 12.00, 'focus': 12.00, 'aware': 9.00, 'psych': 9.00, 'qi': 8.15, 'light': -0.10, 'dark': 0.20, 'kcal': 260.00, 'protein': 0.70, 'sugar': 62.70} }, 'D05_A04_I02': {'name': "12 pack soda", 'cost': 3.98, 'uses': 12, 'role': "drink", 'MATRIX':{'tough': 0.00, 'power': 0.00, 'vigor': 3.00, 'skill': -2.00, 'train': -2.00, 'regen': 0.00, 'vital': -0.40, 'force': 9.00, 'guard': 3.00, 'metab': 9.00, 'fight': 3.00, 'react': 3.00, 'focus': 3.00, 'aware': 3.00, 'psych': 3.00, 'qi': 2.31, 'light': -0.10, 'dark': 0.20, 'kcal': 160.00, 'protein': 0.00, 'sugar': 41.30} }, 'D05_A04_I03': {'name': "water gallon refill", 'cost': 0.20, 'uses': 10, 'role': "drink", 'MATRIX':{'tough': 3.00, 'power': 3.00, 'vigor': 9.00, 'skill': 3.00, 'train': 3.00, 'regen': 9.00, 'vital': 3.00, 'force': 6.00, 'guard': 6.00, 'metab': 15.00, 'fight': 6.00, 'react': 6.00, 'focus': 6.00, 'aware': 6.00, 'psych': 6.00, 'qi': 6.00, 'light': 0.20, 'dark': -0.10, 'kcal': 0.00, 'protein': 0.00, 'sugar': 0.00} }, 'D05_A05_I01': {'name': "chocolate bar", 'cost': 0.89, 'uses': 1, 'role': "food", 'MATRIX':{'tough': 0.00, 'power': 0.00, 'vigor': 3.00, 'skill': -1.00, 'train': -1.00, 'regen': 0.00, 'vital': 0.00, 'force': 3.00, 'guard': 1.50, 'metab': 6.00, 'fight': 1.50, 'react': 0.90, 'focus': 1.50, 'aware': 0.60, 'psych': 1.20, 'qi': 1.15, 'light': -0.10, 'dark': 0.20, 'kcal': 214.00, 'protein': 3.80, 'sugar': 19.70} }, 'D05_A05_I02': {'name': "gummi bears 6lb bag", 'cost': 5.89, 'uses': 57, 'role': "food", 'MATRIX':{'tough': 0.00, 'power': 0.00, 'vigor': 3.00, 'skill': 1.20, 'train': 1.20, 'regen': 0.00, 'vital': 0.00, 'force': -0.10, 'guard': 1.20, 'metab': 6.00, 'fight': 0.90, 'react': 1.20, 'focus': -0.10, 'aware': 0.90, 'psych': 1.50, 'qi': 1.13, 'light': -0.10, 'dark': 0.20, 'kcal': 130.00, 'protein': 3.00, 'sugar': 20.60} }, 'D05_A05_I03': {'name': "peanut butter cups king size", 'cost': 1.39, 'uses': 4, 'role': "food", 'MATRIX':{'tough': 0.00, 'power': 0.00, 'vigor': 3.00, 'skill': -0.40, 'train': -0.40, 'regen': 0.00, 'vital': 0.00, 'force': 1.50, 'guard': 0.60, 'metab': 6.00, 'fight': 0.60, 'react': 0.60, 'focus': 0.60, 'aware': 0.30, 'psych': 0.60, 'qi': 0.87, 'light': -0.10, 'dark': 0.20, 'kcal': 87.00, 'protein': 1.70, 'sugar': 8.40} }, 'D05_A13_I01': {'name': "Apples (5lb)", 'cost': 5.24, 'uses': 12, 'role': "food", 'MATRIX':{'tough': 2.10, 'power': 3.20, 'vigor': 4.00, 'skill': 5.60, 'train': 6.60, 'regen': 3.30, 'vital': 7.10, 'force': 6.10, 'guard': 4.30, 'metab': 15.00, 'fight': 11.00, 'react': 13.00, 'focus': 7.40, 'aware': 8.10, 'psych': 9.30, 'qi': 7.07, 'light': 0.20, 'dark': -0.10, 'kcal': 95.00, 'protein': 0.50, 'sugar': 19.00} }, 'D05_A13_I02': {'name': "Artichokes", 'cost': 1.38, 'uses': 1, 'role': "hard food", 'MATRIX':{'tough': 2.10, 'power': 1.80, 'vigor': 1.80, 'skill': 4.40, 'train': 3.10, 'regen': 4.60, 'vital': 2.30, 'force': 1.70, 'guard': 1.40, 'metab': 15.00, 'fight': 1.70, 'react': 2.10, 'focus': 3.30, 'aware': 4.20, 'psych': 2.60, 'qi': 3.47, 'light': 0.40, 'dark': -0.20, 'kcal': 60.00, 'protein': 4.20, 'sugar': 1.30} }, 'D05_A13_I03': {'name': "Asparagus", 'cost': 2.60, 'uses': 9, 'role': "food", 'MATRIX':{'tough': 2.80, 'power': 4.80, 'vigor': 1.60, 'skill': 6.20, 'train': 5.30, 'regen': 6.10, 'vital': 3.70, 'force': 2.10, 'guard': 2.30, 'metab': 15.00, 'fight': 6.20, 'react': 1.40, 'focus': 2.10, 'aware': 1.10, 'psych': 1.70, 'qi': 4.16, 'light': 0.40, 'dark': -0.20, 'kcal': 9.00, 'protein': 1.20, 'sugar': 0.90} }, 'D05_A13_I04': {'name': "Avocados", 'cost': 2.59, 'uses': 3, 'role': "food", 'MATRIX':{'tough': 2.10, 'power': 2.20, 'vigor': 2.80, 'skill': 7.10, 'train': 5.60, 'regen': 18.60, 'vital': 5.40, 'force': 4.10, 'guard': 3.70, 'metab': 25.00, 'fight': 4.10, 'react': 6.20, 'focus': 7.80, 'aware': 8.40, 'psych': 21.60, 'qi': 8.31, 'light': 0.20, 'dark': -0.10, 'kcal': 234.00, 'protein': 2.90, 'sugar': 1.00} }, 'D05_A13_I05': {'name': "Bananas", 'cost': 0.73, 'uses': 4, 'role': "food", 'MATRIX':{'tough': 2.80, 'power': 3.80, 'vigor': 3.80, 'skill': 8.40, 'train': 7.20, 'regen': 9.70, 'vital': 6.10, 'force': 2.60, 'guard': 3.30, 'metab': 15.00, 'fight': 5.10, 'react': 4.30, 'focus': 8.70, 'aware': 9.20, 'psych': 6.30, 'qi': 6.42, 'light': 0.20, 'dark': -0.10, 'kcal': 105.00, 'protein': 1.30, 'sugar': 14.00} }, 'D05_A13_I06': {'name': "Beets", 'cost': 1.38, 'uses': 3, 'role': "hard food", 'MATRIX':{'tough': 4.80, 'power': 4.40, 'vigor': 1.60, 'skill': 4.60, 'train': 5.10, 'regen': 5.10, 'vital': 5.20, 'force': 4.40, 'guard': 5.20, 'metab': 15.00, 'fight': 7.10, 'react': 6.50, 'focus': 5.50, 'aware': 3.60, 'psych': 4.10, 'qi': 5.48, 'light': 0.40, 'dark': -0.20, 'kcal': 59.00, 'protein': 2.20, 'sugar': 9.00} }, 'D05_A13_I07': {'name': "Bell Peppers", 'cost': 0.59, 'uses': 4, 'role': "food", 'MATRIX':{'tough': 4.10, 'power': 2.80, 'vigor': 0.80, 'skill': 3.20, 'train': 4.70, 'regen': 3.60, 'vital': 1.60, 'force': 4.60, 'guard': 4.10, 'metab': 15.00, 'fight': 6.20, 'react': 4.10, 'focus': 3.20, 'aware': 1.40, 'psych': 2.10, 'qi': 4.10, 'light': 0.40, 'dark': -0.20, 'kcal': 24.00, 'protein': 1.00, 'sugar': 2.90} }, 'D05_A13_I08': {'name': "Blackberries", 'cost': 3.87, 'uses': 5, 'role': "food", 'MATRIX':{'tough': 2.10, 'power': 1.20, 'vigor': 2.80, 'skill': 1.70, 'train': 1.10, 'regen': 4.80, 'vital': 1.70, 'force': 3.70, 'guard': 3.60, 'metab': 15.00, 'fight': 4.10, 'react': 5.60, 'focus': 6.80, 'aware': 4.50, 'psych': 7.20, 'qi': 4.39, 'light': 0.20, 'dark': -0.10, 'kcal': 43.00, 'protein': 1.00, 'sugar': 5.00} }, 'D05_A13_I09': {'name': "Blueberries", 'cost': 4.63, 'uses': 3, 'role': "food", 'MATRIX':{'tough': 2.10, 'power': 0.60, 'vigor': 1.80, 'skill': 1.60, 'train': 1.40, 'regen': 2.20, 'vital': 1.30, 'force': 1.80, 'guard': 2.10, 'metab': 15.00, 'fight': 1.40, 'react': 1.80, 'focus': 13.10, 'aware': 7.20, 'psych': 14.70, 'qi': 4.54, 'light': 0.20, 'dark': -0.10, 'kcal': 85.00, 'protein': 1.10, 'sugar': 15.00} }, 'D05_A13_I10': {'name': "Broccoli", 'cost': 1.43, 'uses': 3, 'role': "food", 'MATRIX':{'tough': 3.10, 'power': 3.00, 'vigor': 2.30, 'skill': 3.70, 'train': 5.90, 'regen': 7.60, 'vital': 8.10, 'force': 4.60, 'guard': 2.20, 'metab': 15.00, 'fight': 8.60, 'react': 6.60, 'focus': 4.00, 'aware': 5.40, 'psych': 8.90, 'qi': 5.93, 'light': 0.40, 'dark': -0.20, 'kcal': 50.00, 'protein': 4.20, 'sugar': 2.50} }, 'D05_A13_I11': {'name': "Cabbage", 'cost': 0.84, 'uses': 2, 'role': "food", 'MATRIX':{'tough': 4.30, 'power': 2.60, 'vigor': 1.40, 'skill': 2.90, 'train': 7.30, 'regen': 6.40, 'vital': 6.20, 'force': 4.30, 'guard': 2.60, 'metab': 15.00, 'fight': 4.30, 'react': 5.40, 'focus': 2.60, 'aware': 1.70, 'psych': 2.40, 'qi': 4.63, 'light': 0.40, 'dark': -0.20, 'kcal': 60.00, 'protein': 3.00, 'sugar': 7.00} }, 'D05_A13_I12': {'name': "Cantalope", 'cost': 1.67, 'uses': 2, 'role': "food", 'MATRIX':{'tough': 3.50, 'power': 1.80, 'vigor': 1.90, 'skill': 2.40, 'train': 6.80, 'regen': 4.60, 'vital': 4.40, 'force': 2.20, 'guard': 1.90, 'metab': 15.00, 'fight': 1.60, 'react': 1.40, 'focus': 5.20, 'aware': 1.00, 'psych': 1.10, 'qi': 3.65, 'light': 0.20, 'dark': -0.10, 'kcal': 93.00, 'protein': 2.30, 'sugar': 21.50} }, 'D05_A13_I13': {'name': "Carrots", 'cost': 0.77, 'uses': 11, 'role': "food", 'MATRIX':{'tough': 2.10, 'power': 2.40, 'vigor': 2.40, 'skill': 7.30, 'train': 6.20, 'regen': 6.10, 'vital': 4.60, 'force': 3.10, 'guard': 2.70, 'metab': 15.00, 'fight': 2.00, 'react': 3.80, 'focus': 5.10, 'aware': 9.60, 'psych': 4.70, 'qi': 5.14, 'light': 0.40, 'dark': -0.20, 'kcal': 25.00, 'protein': 0.60, 'sugar': 2.90} }, 'D05_A13_I14': {'name': "Cauliflower", 'cost': 3.54, 'uses': 2, 'role': "food", 'MATRIX':{'tough': 2.10, 'power': 1.40, 'vigor': 2.60, 'skill': 3.80, 'train': 5.40, 'regen': 6.20, 'vital': 5.90, 'force': 1.50, 'guard': 2.10, 'metab': 15.00, 'fight': 1.40, 'react': 0.70, 'focus': 3.20, 'aware': 4.10, 'psych': 8.60, 'qi': 4.27, 'light': 0.40, 'dark': -0.20, 'kcal': 73.00, 'protein': 5.50, 'sugar': 5.50} }, 'D05_A13_I15': {'name': "Celery", 'cost': 1.16, 'uses': 4, 'role': "food", 'MATRIX':{'tough': 2.80, 'power': 0.90, 'vigor': 0.30, 'skill': 1.40, 'train': 7.60, 'regen': 3.10, 'vital': 2.10, 'force': -0.10, 'guard': 0.40, 'metab': 15.00, 'fight': 7.40, 'react': -0.10, 'focus': -0.10, 'aware': -0.10, 'psych': 4.00, 'qi': 2.97, 'light': 0.60, 'dark': -0.30, 'kcal': 18.00, 'protein': 0.90, 'sugar': 2.10} }, 'D05_A13_I16': {'name': "Cherries", 'cost': 4.58, 'uses': 3, 'role': "food", 'MATRIX':{'tough': 2.10, 'power': 5.40, 'vigor': 4.60, 'skill': 2.60, 'train': 3.40, 'regen': 15.40, 'vital': 6.70, 'force': 5.40, 'guard': 3.20, 'metab': 25.00, 'fight': 2.60, 'react': 7.20, 'focus': 9.60, 'aware': 6.50, 'psych': 9.90, 'qi': 7.31, 'light': 0.20, 'dark': -0.10, 'kcal': 77.00, 'protein': 1.60, 'sugar': 13.00} }, 'D05_A13_I17': {'name': "Chili Peppers", 'cost': 0.59, 'uses': 6, 'role': "food", 'MATRIX':{'tough': 10.50, 'power': 3.60, 'vigor': 5.40, 'skill': 1.80, 'train': 2.10, 'regen': 12.70, 'vital': 8.60, 'force': 13.40, 'guard': 5.70, 'metab': 25.00, 'fight': 9.80, 'react': 11.40, 'focus': 13.20, 'aware': -0.60, 'psych': 16.70, 'qi': 9.29, 'light': 0.60, 'dark': -0.30, 'kcal': 30.00, 'protein': 1.40, 'sugar': 4.00} }, 'D05_A13_I18': {'name': "Coconuts", 'cost': 1.47, 'uses': 2, 'role': "food", 'MATRIX':{'tough': 4.20, 'power': 6.20, 'vigor': 2.10, 'skill': 1.20, 'train': 2.50, 'regen': 7.44, 'vital': 7.40, 'force': 5.20, 'guard': 6.30, 'metab': 20.00, 'fight': 1.10, 'react': 1.30, 'focus': 7.70, 'aware': 3.40, 'psych': 11.40, 'qi': 5.83, 'light': 0.20, 'dark': -0.10, 'kcal': 703.00, 'protein': 6.50, 'sugar': 25.00} }, 'D05_A13_I19': {'name': "Corn Cob", 'cost': 0.62, 'uses': 1, 'role': "hard food", 'MATRIX':{'tough': 6.20, 'power': 3.40, 'vigor': 6.10, 'skill': 0.20, 'train': 0.60, 'regen': 1.20, 'vital': 0.80, 'force': -0.10, 'guard': 0.60, 'metab': 15.00, 'fight': -0.20, 'react': 2.10, 'focus': -0.10, 'aware': 2.20, 'psych': -0.40, 'qi': 2.51, 'light': -0.20, 'dark': 0.10, 'kcal': 155.00, 'protein': 4.50, 'sugar': 32.00} }, 'D05_A13_I20': {'name': "Cranberries", 'cost': 1.86, 'uses': 5, 'role': "food", 'MATRIX':{'tough': 2.80, 'power': 4.20, 'vigor': 3.60, 'skill': 2.10, 'train': 3.20, 'regen': 5.60, 'vital': 7.10, 'force': 2.80, 'guard': 1.70, 'metab': 15.00, 'fight': 6.20, 'react': 2.40, 'focus': 5.10, 'aware': 1.20, 'psych': 3.40, 'qi': 4.43, 'light': 0.20, 'dark': -0.10, 'kcal': 46.00, 'protein': 0.40, 'sugar': 4.00} }, 'D05_A13_I21': {'name': "Cucumbers", 'cost': 0.67, 'uses': 3, 'role': "food", 'MATRIX':{'tough': 2.10, 'power': 1.80, 'vigor': 0.20, 'skill': 1.20, 'train': 1.40, 'regen': 2.10, 'vital': 1.10, 'force': 0.70, 'guard': 0.20, 'metab': 15.00, 'fight': 1.00, 'react': 0.40, 'focus': 1.60, 'aware': 0.80, 'psych': 2.30, 'qi': 2.13, 'light': 0.40, 'dark': -0.20, 'kcal': 2.00, 'protein': 0.10, 'sugar': 0.30} }, 'D05_A13_I22': {'name': "Dragonfruit", 'cost': 2.47, 'uses': 1, 'role': "food", 'MATRIX':{'tough': 6.30, 'power': 5.60, 'vigor': 3.80, 'skill': 5.10, 'train': 4.40, 'regen': 13.80, 'vital': 8.70, 'force': 6.90, 'guard': 5.40, 'metab': 25.00, 'fight': 4.10, 'react': 3.60, 'focus': 2.80, 'aware': 6.20, 'psych': 8.40, 'qi': 7.34, 'light': 0.20, 'dark': -0.10, 'kcal': 52.00, 'protein': 1.10, 'sugar': 11.00} }, 'D05_A13_I23': {'name': "Eggplant", 'cost': 2.58, 'uses': 6, 'role': "food", 'MATRIX':{'tough': 3.10, 'power': 2.80, 'vigor': 1.90, 'skill': 2.60, 'train': 1.90, 'regen': 9.40, 'vital': 4.10, 'force': 5.20, 'guard': 3.30, 'metab': 15.00, 'fight': 1.50, 'react': 2.00, 'focus': 2.10, 'aware': 3.30, 'psych': 1.70, 'qi': 3.99, 'light': 0.60, 'dark': -0.30, 'kcal': 20.00, 'protein': 0.80, 'sugar': 2.90} }, 'D05_A13_I24': {'name': "Garlic", 'cost': 1.86, 'uses': 6, 'role': "food", 'MATRIX':{'tough': 8.40, 'power': 6.80, 'vigor': 4.10, 'skill': 7.70, 'train': 6.80, 'regen': 17.70, 'vital': 6.50, 'force': 7.80, 'guard': 8.10, 'metab': 25.00, 'fight': 4.00, 'react': 3.10, 'focus': 5.50, 'aware': -0.10, 'psych': 4.20, 'qi': 7.71, 'light': 0.60, 'dark': -0.30, 'kcal': 102.00, 'protein': 4.30, 'sugar': 9.00} }, 'D05_A13_I25': {'name': "Grapefruit", 'cost': 1.40, 'uses': 4, 'role': "food", 'MATRIX':{'tough': 3.50, 'power': 8.40, 'vigor': 5.60, 'skill': 5.60, 'train': 5.40, 'regen': 11.20, 'vital': 5.80, 'force': 6.20, 'guard': 5.70, 'metab': 25.00, 'fight': 7.10, 'react': 6.50, 'focus': -0.10, 'aware': 9.20, 'psych': -0.20, 'qi': 6.99, 'light': 0.20, 'dark': -0.10, 'kcal': 52.00, 'protein': 0.90, 'sugar': 8.00} }, 'D05_A13_I26': {'name': "Grapes Green", 'cost': 2.98, 'uses': 5, 'role': "food", 'MATRIX':{'tough': 1.10, 'power': 1.10, 'vigor': 2.80, 'skill': 3.80, 'train': 2.10, 'regen': 2.60, 'vital': 1.60, 'force': 2.20, 'guard': 2.60, 'metab': 15.00, 'fight': 0.40, 'react': 2.20, 'focus': 4.70, 'aware': 7.80, 'psych': 6.10, 'qi': 3.74, 'light': 0.20, 'dark': -0.10, 'kcal': 59.00, 'protein': 0.50, 'sugar': 14.00} }, 'D05_A13_I27': {'name': "Grapes Red", 'cost': 2.54, 'uses': 5, 'role': "food", 'MATRIX':{'tough': 1.30, 'power': 1.20, 'vigor': 2.40, 'skill': 2.20, 'train': 2.70, 'regen': 2.90, 'vital': 1.20, 'force': 2.30, 'guard': 3.10, 'metab': 15.00, 'fight': 0.20, 'react': 4.10, 'focus': 3.90, 'aware': 5.60, 'psych': 4.90, 'qi': 3.53, 'light': 0.20, 'dark': -0.10, 'kcal': 68.00, 'protein': 0.60, 'sugar': 17.00} }, 'D05_A13_I28': {'name': "Green Beans", 'cost': 1.36, 'uses': 5, 'role': "food", 'MATRIX':{'tough': 2.10, 'power': 1.20, 'vigor': 0.80, 'skill': 1.60, 'train': 1.40, 'regen': 5.60, 'vital': 2.10, 'force': 1.40, 'guard': 1.80, 'metab': 15.00, 'fight': 3.10, 'react': 2.80, 'focus': 2.50, 'aware': 2.00, 'psych': 1.60, 'qi': 3.00, 'light': 0.40, 'dark': -0.20, 'kcal': 31.00, 'protein': 1.80, 'sugar': 0.50} }, 'D05_A13_I29': {'name': "Green Onions (scallions)", 'cost': 2.19, 'uses': 10, 'role': "food", 'MATRIX':{'tough': 2.80, 'power': 2.60, 'vigor': 1.60, 'skill': 2.60, 'train': 2.40, 'regen': 6.10, 'vital': 4.40, 'force': 3.10, 'guard': 2.70, 'metab': 15.00, 'fight': 6.00, 'react': 5.80, 'focus': 7.70, 'aware': 8.10, 'psych': 1.80, 'qi': 4.85, 'light': 0.40, 'dark': -0.20, 'kcal': 15.00, 'protein': 0.90, 'sugar': 0.90} }, 'D05_A13_I30': {'name': "Guava", 'cost': 3.54, 'uses': 7, 'role': "food", 'MATRIX':{'tough': 2.10, 'power': 1.20, 'vigor': 3.80, 'skill': 2.10, 'train': 3.70, 'regen': 7.10, 'vital': 2.30, 'force': 2.80, 'guard': 1.40, 'metab': 15.00, 'fight': 7.10, 'react': 6.30, 'focus': 8.20, 'aware': 4.80, 'psych': 5.60, 'qi': 4.90, 'light': 0.20, 'dark': -0.10, 'kcal': 38.00, 'protein': 1.40, 'sugar': 4.90} }, 'D05_A13_I31': {'name': "Jalapenos", 'cost': 1.19, 'uses': 5, 'role': "food", 'MATRIX':{'tough': 25.90, 'power': 3.80, 'vigor': 6.80, 'skill': 8.90, 'train': 9.40, 'regen': 14.90, 'vital': 5.20, 'force': 9.90, 'guard': 6.70, 'metab': 25.00, 'fight': 9.60, 'react': 11.80, 'focus': 10.40, 'aware': -2.60, 'psych': 9.40, 'qi': 10.34, 'light': 0.80, 'dark': -0.40, 'kcal': 26.00, 'protein': 0.80, 'sugar': 3.70} }, 'D05_A13_I32': {'name': "Kale", 'cost': 2.27, 'uses': 6, 'role': "food", 'MATRIX':{'tough': 4.10, 'power': 2.30, 'vigor': 1.80, 'skill': 7.60, 'train': 7.30, 'regen': 38.60, 'vital': -1.80, 'force': 4.60, 'guard': 8.40, 'metab': 10.00, 'fight': -0.60, 'react': -1.40, 'focus': -0.10, 'aware': -0.80, 'psych': 7.10, 'qi': 5.81, 'light': 0.80, 'dark': -0.40, 'kcal': 33.00, 'protein': 2.90, 'sugar': 1.60} }, 'D05_A13_I33': {'name': "Kiwis", 'cost': 0.45, 'uses': 1, 'role': "food", 'MATRIX':{'tough': 2.10, 'power': 1.80, 'vigor': 2.30, 'skill': 3.40, 'train': 1.70, 'regen': 4.20, 'vital': 2.40, 'force': 2.30, 'guard': 4.10, 'metab': 15.00, 'fight': 4.80, 'react': 6.10, 'focus': 5.10, 'aware': 4.20, 'psych': 3.90, 'qi': 4.23, 'light': 0.20, 'dark': -0.10, 'kcal': 42.00, 'protein': 0.80, 'sugar': 6.00} }, 'D05_A13_I34': {'name': "Lemons", 'cost': 1.21, 'uses': 16, 'role': "food", 'MATRIX':{'tough': 12.40, 'power': 5.10, 'vigor': 6.20, 'skill': 9.60, 'train': 10.20, 'regen': 15.30, 'vital': 7.70, 'force': 8.70, 'guard': 7.70, 'metab': 25.00, 'fight': 8.60, 'react': 9.70, 'focus': 6.40, 'aware': 18.60, 'psych': -1.80, 'qi': 9.96, 'light': 0.40, 'dark': -0.20, 'kcal': 9.00, 'protein': 0.30, 'sugar': 0.80} }, 'D05_A13_I35': {'name': "Lettuce Iceberg", 'cost': 1.52, 'uses': 6, 'role': "food", 'MATRIX':{'tough': 0.20, 'power': 0.30, 'vigor': 0.10, 'skill': 1.40, 'train': 1.10, 'regen': 0.10, 'vital': 0.10, 'force': 1.20, 'guard': 1.10, 'metab': 15.00, 'fight': 1.40, 'react': 2.60, 'focus': 3.10, 'aware': 2.30, 'psych': 2.60, 'qi': 2.17, 'light': 0.20, 'dark': -0.10, 'kcal': 10.00, 'protein': 1.00, 'sugar': 2.00} }, 'D05_A13_I36': {'name': "Limes", 'cost': 1.49, 'uses': 6, 'role': "food", 'MATRIX':{'tough': 4.30, 'power': 3.80, 'vigor': 2.80, 'skill': 5.10, 'train': 4.40, 'regen': 10.70, 'vital': 12.10, 'force': 4.80, 'guard': 5.90, 'metab': 25.00, 'fight': 6.00, 'react': 4.00, 'focus': 7.10, 'aware': 6.90, 'psych': 11.80, 'qi': 7.65, 'light': 0.20, 'dark': -0.10, 'kcal': 20.00, 'protein': 0.50, 'sugar': 1.10} }, 'D05_A13_I37': {'name': "Mangos", 'cost': 1.61, 'uses': 1, 'role': "food", 'MATRIX':{'tough': 2.10, 'power': 2.80, 'vigor': 3.80, 'skill': 3.20, 'train': 2.60, 'regen': 7.80, 'vital': 7.40, 'force': 2.30, 'guard': 2.40, 'metab': 15.00, 'fight': -1.60, 'react': -0.10, 'focus': 3.20, 'aware': -0.10, 'psych': 4.10, 'qi': 3.66, 'light': 0.20, 'dark': -0.10, 'kcal': 201.00, 'protein': 2.80, 'sugar': 46.00} }, 'D05_A13_I38': {'name': "Mushrooms Portobello", 'cost': 4.53, 'uses': 5, 'role': "food", 'MATRIX':{'tough': 2.10, 'power': 2.40, 'vigor': 2.40, 'skill': 4.30, 'train': 3.60, 'regen': 12.20, 'vital': 3.20, 'force': 2.10, 'guard': 3.60, 'metab': 15.00, 'fight': -0.40, 'react': -0.10, 'focus': 7.20, 'aware': 8.10, 'psych': 16.90, 'qi': 5.51, 'light': 0.40, 'dark': -0.20, 'kcal': 20.00, 'protein': 3.00, 'sugar': 2.00} }, 'D05_A13_I39': {'name': "Nectarines", 'cost': 2.43, 'uses': 3, 'role': "food", 'MATRIX':{'tough': 2.80, 'power': 2.80, 'vigor': 2.60, 'skill': 2.70, 'train': 4.40, 'regen': 7.80, 'vital': 5.10, 'force': 2.40, 'guard': 2.60, 'metab': 15.00, 'fight': 3.60, 'react': 4.90, 'focus': 6.20, 'aware': 2.90, 'psych': 5.10, 'qi': 4.73, 'light': 0.20, 'dark': -0.10, 'kcal': 63.00, 'protein': 1.50, 'sugar': 11.00} }, 'D05_A13_I40': {'name': "Olives", 'cost': 2.24, 'uses': 10, 'role': "food", 'MATRIX':{'tough': 2.10, 'power': 1.90, 'vigor': 1.40, 'skill': 4.20, 'train': 2.20, 'regen': 9.10, 'vital': 1.40, 'force': 3.00, 'guard': 2.40, 'metab': 15.00, 'fight': 6.70, 'react': 2.90, 'focus': 3.20, 'aware': 0.80, 'psych': 7.10, 'qi': 4.23, 'light': 0.20, 'dark': -0.10, 'kcal': 56.00, 'protein': 6.00, 'sugar': 8.00} }, 'D05_A13_I41': {'name': "Onions", 'cost': 1.14, 'uses': 13, 'role': "food", 'MATRIX':{'tough': 6.30, 'power': 5.40, 'vigor': 5.40, 'skill': 5.60, 'train': 4.30, 'regen': 11.30, 'vital': 2.10, 'force': 6.20, 'guard': 5.70, 'metab': 15.00, 'fight': 8.10, 'react': 9.60, 'focus': 3.00, 'aware': -0.10, 'psych': 4.70, 'qi': 6.17, 'light': 0.40, 'dark': -0.20, 'kcal': 44.00, 'protein': 1.20, 'sugar': 4.70} }, 'D05_A13_I42': {'name': "Oranges", 'cost': 1.15, 'uses': 3, 'role': "food", 'MATRIX':{'tough': 2.10, 'power': 4.80, 'vigor': 3.80, 'skill': 4.80, 'train': 5.70, 'regen': 17.40, 'vital': 15.20, 'force': 6.90, 'guard': 11.10, 'metab': 25.00, 'fight': 2.10, 'react': 4.40, 'focus': 5.90, 'aware': 6.30, 'psych': 11.70, 'qi': 8.48, 'light': 0.20, 'dark': -0.10, 'kcal': 78.00, 'protein': 1.50, 'sugar': 15.00} }, 'D05_A13_I43': {'name': "Papayas", 'cost': 1.63, 'uses': 3, 'role': "food", 'MATRIX':{'tough': 2.10, 'power': 2.60, 'vigor': 4.70, 'skill': 4.10, 'train': 5.30, 'regen': 8.60, 'vital': 6.80, 'force': 2.00, 'guard': 3.80, 'metab': 15.00, 'fight': 0.20, 'react': 2.90, 'focus': 1.60, 'aware': 5.10, 'psych': 4.40, 'qi': 4.61, 'light': 0.20, 'dark': -0.10, 'kcal': 67.00, 'protein': 0.70, 'sugar': 12.00} }, 'D05_A13_I44': {'name': "Passion Fruit", 'cost': 7.43, 'uses': 25, 'role': "food", 'MATRIX':{'tough': 5.30, 'power': 6.30, 'vigor': 8.90, 'skill': 6.90, 'train': 3.40, 'regen': 13.90, 'vital': 11.40, 'force': -0.60, 'guard': 6.90, 'metab': 15.00, 'fight': 3.40, 'react': 6.90, 'focus': 9.80, 'aware': 13.40, 'psych': 5.00, 'qi': 7.73, 'light': 0.20, 'dark': -0.10, 'kcal': 17.00, 'protein': 0.40, 'sugar': 2.00} }, 'D05_A13_I45': {'name': "Peaches", 'cost': 2.64, 'uses': 3, 'role': "food", 'MATRIX':{'tough': 2.10, 'power': 2.70, 'vigor': 6.20, 'skill': 4.70, 'train': 4.20, 'regen': 5.90, 'vital': 6.70, 'force': 2.30, 'guard': 3.00, 'metab': 15.00, 'fight': 6.20, 'react': 4.40, 'focus': 2.60, 'aware': 3.80, 'psych': 3.10, 'qi': 4.86, 'light': 0.20, 'dark': -0.10, 'kcal': 59.00, 'protein': 1.40, 'sugar': 13.00} }, 'D05_A13_I46': {'name': "Pears", 'cost': 1.38, 'uses': 2, 'role': "food", 'MATRIX':{'tough': 2.10, 'power': 1.30, 'vigor': 2.70, 'skill': 2.60, 'train': 3.70, 'regen': 2.40, 'vital': 1.90, 'force': 1.40, 'guard': 1.90, 'metab': 15.00, 'fight': 6.10, 'react': 8.60, 'focus': 4.40, 'aware': 2.20, 'psych': 1.30, 'qi': 3.84, 'light': 0.20, 'dark': -0.10, 'kcal': 102.00, 'protein': 0.60, 'sugar': 17.00} }, 'D05_A13_I47': {'name': "Pineapples", 'cost': 2.74, 'uses': 3, 'role': "food", 'MATRIX':{'tough': 6.50, 'power': 4.60, 'vigor': 7.40, 'skill': 6.10, 'train': 4.50, 'regen': 21.30, 'vital': 14.10, 'force': 4.40, 'guard': 5.80, 'metab': 25.00, 'fight': 2.40, 'react': 6.90, 'focus': 16.20, 'aware': 14.60, 'psych': 10.10, 'qi': 9.99, 'light': 0.40, 'dark': -0.20, 'kcal': 151.00, 'protein': 1.60, 'sugar': 29.70} }, 'D05_A13_I48': {'name': "Plums", 'cost': 1.68, 'uses': 1, 'role': "food", 'MATRIX':{'tough': 4.10, 'power': 2.30, 'vigor': 2.10, 'skill': 3.60, 'train': 4.90, 'regen': 6.70, 'vital': 4.10, 'force': 2.20, 'guard': 4.00, 'metab': 15.00, 'fight': 5.20, 'react': 1.80, 'focus': -0.10, 'aware': 1.20, 'psych': 2.00, 'qi': 3.94, 'light': 0.20, 'dark': -0.10, 'kcal': 30.00, 'protein': 0.50, 'sugar': 7.00} }, 'D05_A13_I49': {'name': "Pomegranate", 'cost': 1.13, 'uses': 3, 'role': "food", 'MATRIX':{'tough': 5.40, 'power': 1.70, 'vigor': 4.30, 'skill': 4.40, 'train': 4.10, 'regen': 9.60, 'vital': 8.70, 'force': -0.10, 'guard': 5.40, 'metab': 15.00, 'fight': 0.60, 'react': 17.10, 'focus': 6.70, 'aware': 2.60, 'psych': 7.40, 'qi': 6.19, 'light': 0.20, 'dark': -0.10, 'kcal': 72.00, 'protein': 1.50, 'sugar': 12.00} }, 'D05_A13_I50': {'name': "Potatoes (5lb bag)", 'cost': 2.64, 'uses': 12, 'role': "hard food", 'MATRIX':{'tough': 2.10, 'power': 1.40, 'vigor': 8.20, 'skill': 0.20, 'train': 0.60, 'regen': 2.70, 'vital': 3.30, 'force': 2.10, 'guard': 2.70, 'metab': 15.00, 'fight': 11.10, 'react': 5.10, 'focus': 4.60, 'aware': 3.50, 'psych': 2.40, 'qi': 4.33, 'light': 0.20, 'dark': -0.10, 'kcal': 163.00, 'protein': 4.30, 'sugar': 1.70} }, 'D05_A13_I51': {'name': "Pumpkin (2lb)", 'cost': 3.08, 'uses': 8, 'role': "food", 'MATRIX':{'tough': 2.10, 'power': 1.80, 'vigor': 4.40, 'skill': 2.10, 'train': 1.60, 'regen': 7.80, 'vital': 2.40, 'force': 1.40, 'guard': 2.90, 'metab': 15.00, 'fight': 6.40, 'react': 5.50, 'focus': 3.90, 'aware': 2.70, 'psych': 4.10, 'qi': 4.27, 'light': 0.40, 'dark': -0.20, 'kcal': 30.00, 'protein': 1.20, 'sugar': 3.20} }, 'D05_A13_I52': {'name': "Raspberries", 'cost': 2.98, 'uses': 4, 'role': "food", 'MATRIX':{'tough': 3.30, 'power': 1.30, 'vigor': 5.40, 'skill': 2.40, 'train': 4.40, 'regen': 16.10, 'vital': 6.10, 'force': 3.20, 'guard': 5.50, 'metab': 45.00, 'fight': 2.70, 'react': 6.20, 'focus': 7.10, 'aware': 14.20, 'psych': 9.20, 'qi': 8.81, 'light': 0.20, 'dark': -0.10, 'kcal': 65.00, 'protein': 1.50, 'sugar': 5.00} }, 'D05_A13_I53': {'name': "Spinach", 'cost': 6.07, 'uses': 3, 'role': "food", 'MATRIX':{'tough': 7.40, 'power': 27.60, 'vigor': 6.70, 'skill': 8.20, 'train': 7.10, 'regen': 11.40, 'vital': 13.10, 'force': 4.30, 'guard': 4.00, 'metab': 15.00, 'fight': 14.60, 'react': 2.10, 'focus': 1.90, 'aware': -1.20, 'psych': 4.70, 'qi': 8.46, 'light': 0.60, 'dark': -0.30, 'kcal': 35.00, 'protein': 4.50, 'sugar': 0.50} }, 'D05_A13_I54': {'name': "Squash", 'cost': 2.06, 'uses': 2, 'role': "food", 'MATRIX':{'tough': 4.70, 'power': 3.30, 'vigor': 2.60, 'skill': 2.60, 'train': 4.10, 'regen': 7.20, 'vital': 2.40, 'force': 2.60, 'guard': 1.40, 'metab': 15.00, 'fight': 7.10, 'react': 6.80, 'focus': 2.70, 'aware': 3.90, 'psych': 1.10, 'qi': 4.50, 'light': 0.40, 'dark': -0.20, 'kcal': 76.00, 'protein': 1.80, 'sugar': 7.00} }, 'D05_A13_I55': {'name': "Star fruit (carambola)", 'cost': 5.67, 'uses': 5, 'role': "food", 'MATRIX':{'tough': 3.50, 'power': 2.80, 'vigor': 5.80, 'skill': 3.30, 'train': 1.80, 'regen': 8.40, 'vital': 7.30, 'force': 6.30, 'guard': 7.10, 'metab': 15.00, 'fight': -1.70, 'react': 2.60, 'focus': 18.40, 'aware': 14.70, 'psych': 19.90, 'qi': 7.68, 'light': 0.20, 'dark': -0.10, 'kcal': 28.00, 'protein': 0.90, 'sugar': 3.60} }, 'D05_A13_I56': {'name': "Strawberries", 'cost': 6.29, 'uses': 6, 'role': "food", 'MATRIX':{'tough': 2.10, 'power': 0.60, 'vigor': 8.40, 'skill': 0.70, 'train': 0.40, 'regen': 4.60, 'vital': 2.80, 'force': -0.10, 'guard': 1.60, 'metab': 15.00, 'fight': 3.10, 'react': 2.70, 'focus': 1.60, 'aware': 6.80, 'psych': 16.20, 'qi': 4.43, 'light': 0.20, 'dark': -0.10, 'kcal': 28.00, 'protein': 0.70, 'sugar': 4.20} }, 'D05_A13_I57': {'name': "Sweet Potatoes", 'cost': 1.78, 'uses': 4, 'role': "food", 'MATRIX':{'tough': 3.10, 'power': 2.60, 'vigor': 5.50, 'skill': 1.60, 'train': 3.10, 'regen': 6.50, 'vital': 3.50, 'force': 2.60, 'guard': 2.80, 'metab': 15.00, 'fight': 4.90, 'react': 5.30, 'focus': 6.40, 'aware': 5.40, 'psych': 2.30, 'qi': 4.71, 'light': 0.20, 'dark': -0.10, 'kcal': 114.00, 'protein': 2.10, 'sugar': 6.00} }, 'D05_A13_I58': {'name': "Tangerines", 'cost': 3.04, 'uses': 5, 'role': "food", 'MATRIX':{'tough': 2.10, 'power': 2.40, 'vigor': 6.30, 'skill': 2.70, 'train': 3.40, 'regen': 11.10, 'vital': 7.10, 'force': 3.70, 'guard': 4.60, 'metab': 25.00, 'fight': -0.20, 'react': 3.00, 'focus': 6.50, 'aware': 8.00, 'psych': 7.70, 'qi': 6.23, 'light': 0.20, 'dark': -0.10, 'kcal': 47.00, 'protein': 0.70, 'sugar': 9.00} }, 'D05_A13_I59': {'name': "Tomatoes", 'cost': 2.87, 'uses': 4, 'role': "food", 'MATRIX':{'tough': 2.80, 'power': 1.50, 'vigor': 1.70, 'skill': 2.10, 'train': 4.30, 'regen': 7.50, 'vital': 3.20, 'force': 2.90, 'guard': 4.10, 'metab': 15.00, 'fight': 10.00, 'react': 6.60, 'focus': 2.30, 'aware': 4.10, 'psych': 3.80, 'qi': 4.79, 'light': 0.20, 'dark': -0.10, 'kcal': 22.00, 'protein': 1.10, 'sugar': 3.20} }, 'D05_A13_I60': {'name': "Watermelon (5lb)", 'cost': 3.14, 'uses': 8, 'role': "food", 'MATRIX':{'tough': 2.10, 'power': 1.30, 'vigor': 2.40, 'skill': 2.20, 'train': 3.10, 'regen': 5.70, 'vital': 4.40, 'force': 3.60, 'guard': 5.40, 'metab': 30.00, 'fight': 13.30, 'react': 9.70, 'focus': 4.20, 'aware': 5.10, 'psych': 1.20, 'qi': 6.25, 'light': 0.20, 'dark': -0.10, 'kcal': 85.00, 'protein': 1.70, 'sugar': 17.00} }, 'D05_A13_I61': {'name': "Zucchini", 'cost': 2.21, 'uses': 2, 'role': "food", 'MATRIX':{'tough': 4.10, 'power': 1.90, 'vigor': 1.20, 'skill': 2.50, 'train': 5.70, 'regen': 5.40, 'vital': 5.10, 'force': 2.60, 'guard': 6.10, 'metab': 15.00, 'fight': 6.70, 'react': 3.10, 'focus': 0.30, 'aware': 6.90, 'psych': -0.10, 'qi': 4.43, 'light': 0.40, 'dark': -0.20, 'kcal': 44.00, 'protein': 3.20, 'sugar': 6.50} }, 'D05_A14_I01': {'name': "Beef Jerky 10oz bag Teriyaki", 'cost': 11.95, 'uses': 10, 'role': "food", 'MATRIX':{'tough': 9.60, 'power': 13.40, 'vigor': 11.80, 'skill': -0.10, 'train': 3.30, 'regen': 4.60, 'vital': 1.40, 'force': 6.20, 'guard': 7.10, 'metab': 12.00, 'fight': 13.20, 'react': 11.80, 'focus': 6.10, 'aware': -1.20, 'psych': -4.00, 'qi': 6.35, 'light': -0.50, 'dark': 1.00, 'kcal': 108.00, 'protein': 12.10, 'sugar': 1.00} }, 'D05_A14_I02': {'name': "Mixed Nuts 1lb", 'cost': 4.95, 'uses': 13, 'role': "food", 'MATRIX':{'tough': 4.20, 'power': 6.70, 'vigor': 7.60, 'skill': 3.40, 'train': 4.10, 'regen': 1.20, 'vital': 2.60, 'force': 8.10, 'guard': 8.60, 'metab': 9.00, 'fight': 7.10, 'react': 6.20, 'focus': 8.40, 'aware': 6.10, 'psych': 7.10, 'qi': 6.03, 'light': 0.20, 'dark': 0.10, 'kcal': 180.00, 'protein': 6.40, 'sugar': 4.00} }, 'D05_A14_I03': {'name': "Potato Chips Family Size", 'cost': 4.29, 'uses': 14, 'role': "food", 'MATRIX':{'tough': 2.10, 'power': 1.00, 'vigor': 1.50, 'skill': 0.40, 'train': -0.10, 'regen': -0.40, 'vital': 0.40, 'force': 0.20, 'guard': -0.20, 'metab': 18.00, 'fight': -0.60, 'react': -0.80, 'focus': -2.00, 'aware': -0.60, 'psych': 2.10, 'qi': 1.40, 'light': -0.10, 'dark': 0.20, 'kcal': 152.00, 'protein': 1.90, 'sugar': 15.00} }, 'D08_A09_I01': {'name': "sheets", 'cost': 11.98, 'uses': 200, 'role': "bedding", 'MATRIX':{} }, 'D08_A09_I02': {'name': "towel", 'cost': 6.98, 'uses': 120, 'role': "towel", 'MATRIX':{} }, 'D08_A09_I03': {'name': "washcloth 2pk", 'cost': 0.98, 'uses': 70, 'role': "hygiene", 'MATRIX':{} }, 'items.Supplements.AMAZone': {'name': "Anabolic Muscle Activation Zone", 'cost': 0.00, 'uses': 1, 'role': "food", 'MATRIX':{} }, 'items.Supplements.DeviLabs': {'name': "DeviLabs Fat Burner", 'cost': 0.00, 'uses': 1, 'role': "food", 'MATRIX':{} }, 'items.Oils.Engorgement': {'name': "Oil of Engorgement", 'cost': 100.00, 'uses': 7, 'role': "food", 'MATRIX':{} }, 'items.Oils.Withering': {'name': "Oil of Withering", 'cost': 30.00, 'uses': 7, 'role': "food", 'MATRIX':{} }, /* END setup.DATA.ITEMS */ }>>
<<set setup.STATUSES = { 'weight' : function(CHAR) { if(!CHAR) { setup.ALIAS.debugLog('weight - NO CHAR!'); } var cond = null; var wt = setup.ALIAS.weightGet('base', CHAR); if(!wt || wt<1) { return null; } var whRatio = wt/72; switch(true) { case (whRatio<1): cond = 'dead from starvation'; CHAR.dead=true; CHAR.CoD='died of starvation...'; break; case (whRatio<1.09): cond = 'weak from starvation'; break; case (whRatio<1.18): cond = 'starving...'; break; case (whRatio<1.27): cond = 'severely malnourished'; break; case (whRatio<1.36): cond = 'walking skelleton'; break; case (whRatio<1.45): cond = 'skin & bones'; break; case (whRatio<1.54): cond = 'dangerously thin'; break; case (whRatio<1.63): cond = 'gaunt'; break; case (whRatio<1.72): cond = 'scrawny'; break; case (whRatio<1.81): cond = 'very thin'; break; case (whRatio<1.90): cond = 'skinny'; break; case (whRatio<1.99): cond = 'thin'; break; default: cond = null; break; } if(CHAR.STATUS.weight != cond) { /* status changed */ } CHAR.STATUS.weight = cond; }, 'qi' : function(CHAR) { if(!CHAR) { setup.ALIAS.debugLog('qi - NO CHAR!'); } var cond = null; var pronoun = null; var AzI = $G.WORLD.amazonIndex; var S = setup.ALIAS.statGet('all', 'current', CHAR); var x = 1; var gender = ((CHAR.TRAITS && CHAR.TRAITS.gender) ? CHAR.TRAITS.gender : (CHAR.gender ? CHAR.gender : 'unknown')).toLowerCase(); var qi = CHAR.MATRIX.qi; var sE = setup.ALIAS; switch(true) { case (gender=='goddess'): pronoun='her'; x=1+S.level*6+AzI; break; case (gender=='amazon'): pronoun='her'; x=1+S.level+AzI; break; case (gender=='futazon'): pronoun='her'; x=1+S.level; break; case (gender=='female'): pronoun='her'; x=1+S.capacity+AzI; break; case (gender=='herm'): case (gender=='futa'): pronoun='her'; x=1+S.capacity; break; case (gender=='dickgirl'): pronoun='her'; x=1+S.caliber; break; case (gender=='male'): pronoun='his'; x=1+S.magnitude; break; case (gender=='none'): pronoun='its'; x=1+2; break; case (gender=='shifter'): pronoun='their'; x=1+2; break; default: pronoun='their'; x=1+2; break; } switch(true) { case (qi<(S.max_qi * -sE.pow(x, 6, '-') )): cond = 'obliterated'; CHAR.stun= -1; CHAR.ko= -1; CHAR.dead= 4; CHAR.gone= 1; CHAR.CoD = 'was completely destroyed...'; break; case (qi<(S.max_qi * -sE.pow(x, 5, '-') )): cond = 'torn apart'; CHAR.stun= -1; CHAR.ko= -1; CHAR.dead= 3; CHAR.CoD = 'has been ripped to pieces...'; break; case (qi<(S.max_qi * -sE.pow(x, 4, '-') )): cond = 'mangled'; CHAR.stun= -1; CHAR.ko= -1; CHAR.dead= 2; CHAR.CoD = 'died of severe injuries, including crushed limbs and ruptured organs...'; break; case (qi<(S.max_qi * -sE.pow(x, 3, '-') )): cond = 'killed'; CHAR.stun= -1; CHAR.ko= -1; CHAR.dead= 1; CHAR.CoD = 'died of '+ pronoun +' injuries...'; break; case (qi<(S.max_qi * -sE.pow(x, 2, '-') )): cond = 'broken'; CHAR.stun= 8; CHAR.ko= 3; break; case (qi<(S.max_qi * -sE.pow(x, 1, '-') )): cond = 'comatose'; CHAR.stun= 6; CHAR.ko= 2; break; case (qi<(S.max_qi * -sE.pow(x, 0, '-') )): cond = 'unconscious'; CHAR.stun= 4; CHAR.ko= 1; break; case (qi<(S.max_qi * 0.00 )): cond = 'dazed'; CHAR.stun= 2; CHAR.ko= 0; break; default: cond = null; CHAR.stun= 0; CHAR.ko= 0; break; } if(CHAR.STATUS.qi != cond) { /* status changed */ } CHAR.STATUS.qi = cond; }, 'tough' : function(CHAR) { if(!CHAR) { setup.ALIAS.debugLog('tough - NO CHAR!'); } var cond = null; var M = CHAR.MATRIX; switch(true) { case (M.tough<(setup.ALIAS.maxResource('tough', CHAR) * 0.00)): cond = 'hurt'; break; case (M.tough<(setup.ALIAS.maxResource('tough', CHAR) * 0.50)): cond = 'bruised'; break; default: break; } if(CHAR.STATUS.tough != cond) { /* status changed */ } CHAR.STATUS.tough = cond; }, 'power' : function(CHAR) { if(!CHAR) { setup.ALIAS.debugLog('power - NO CHAR!'); } var cond = null; var M = CHAR.MATRIX; switch(true) { case (M.power<(setup.ALIAS.maxResource('power', CHAR) * 0.00)): cond = 'limp'; break; case (M.power<(setup.ALIAS.maxResource('power', CHAR) * 0.50)): cond = 'weak'; break; default: break; } if(CHAR.STATUS.power != cond) { /* status changed */ } CHAR.STATUS.power = cond; }, 'vigor' : function(CHAR) { if(!CHAR) { setup.ALIAS.debugLog('vigor - NO CHAR!'); } var cond = null; var M = CHAR.MATRIX; switch(true) { case (M.vigor<(setup.ALIAS.maxResource('vigor', CHAR) * 0.00)): cond = 'exhausted'; break; case (M.vigor<(setup.ALIAS.maxResource('vigor', CHAR) * 0.50)): cond = 'tired'; break; default: break; } if(CHAR.STATUS.vigor != cond) { /* status changed */ } CHAR.STATUS.vigor = cond; }, /* END setup.STATUSES */ }>>
<<set setup.ACTIONS = {}>> <<include 'setup.ACTIONS.COMBAT'>> <<include 'setup.ACTIONS.EXPLORE'>> <<include 'setup.ACTIONS.REST'>> <<include 'setup.ACTIONS.TRAIN'>>
<<set setup.CHARS = { /* CHARACTERS STORED SEPARATELY */ }>> <<include 'setup.CHARS.Cindy_Phoenix'>> <<include 'setup.CHARS.Tammi_X'>> <<include 'setup.CHARS.Susan_Marien'>> <<include 'setup.CHARS.Leona_Lee'>>
<<set setup.ROLES = { 'EQUIP_ZONES': { 'backpack' :{ 'desc':"...", }, 'belt' :{ 'desc':"...", }, 'bra' :{ 'desc':"...", }, 'bracelet' :{ 'desc':"...", }, 'coat' :{ 'desc':"...", }, 'dress' :{ 'desc':"...", }, 'earrings' :{ 'desc':"...", }, 'glasses' :{ 'desc':"...", }, 'gloves' :{ 'desc':"...", }, 'hat' :{ 'desc':"...", }, 'headband' :{ 'desc':"...", }, 'handbag' :{ 'desc':"...", }, 'jacket' :{ 'desc':"...", }, 'mask' :{ 'desc':"...", }, 'necklace' :{ 'desc':"...", }, 'onepiece' :{ 'desc':"...", }, 'overshirt' :{ 'desc':"...", }, 'panties' :{ 'desc':"...", }, 'pants' :{ 'desc':"...", }, 'ring' :{ 'desc':"...", }, 'sash' :{ 'desc':"...", }, 'shirt' :{ 'desc':"...", }, 'shoes' :{ 'desc':"...", }, 'shorts' :{ 'desc':"...", }, 'skirt' :{ 'desc':"...", }, 'socks' :{ 'desc':"...", }, 'undershirt' :{ 'desc':"...", }, 'vest' :{ 'desc':"...", }, }, 'ALL':{ 'backpack' :{ 'type':"wearable" , 'subtype':"bag" , 'tags':[ ], 'desc':"...", }, 'bedding' :{ 'type':"" , 'subtype':"" , 'tags':[ ], 'desc':"...", }, 'belt' :{ 'type':"wearable" , 'subtype':"clothing" , 'tags':[ ], 'desc':"...", }, 'book' :{ 'type':"media" , 'subtype':"readable" , 'tags':[ ], 'desc':"...", }, 'booze' :{ 'type':"consumable" , 'subtype':"drink" , 'tags':[ 'buzz', 'depressant', 'toxin', ], 'desc':"...", }, 'bra' :{ 'type':"wearable" , 'subtype':"clothing" , 'tags':[ ], 'desc':"...", }, 'bracelet' :{ 'type':"wearable" , 'subtype':"jewelry" , 'tags':[ ], 'desc':"...", }, 'cabinet' :{ 'type':"" , 'subtype':"" , 'tags':[ ], 'desc':"...", }, 'canned food' :{ 'type':"consumable" , 'subtype':"food" , 'tags':[ 'canned', ], 'desc':"...", }, 'CD' :{ 'type':"media" , 'subtype':"audio" , 'tags':[ 'CD', ], 'desc':"...", }, 'chair' :{ 'type':"" , 'subtype':"" , 'tags':[ ], 'desc':"...", }, 'chemical' :{ 'type':"" , 'subtype':"" , 'tags':[ ], 'desc':"...", }, 'coat' :{ 'type':"wearable" , 'subtype':"clothing" , 'tags':[ ], 'desc':"...", }, 'computer' :{ 'type':"" , 'subtype':"" , 'tags':[ ], 'desc':"...", }, 'desk' :{ 'type':"furniture" , 'subtype':"work surface", 'tags':[ 'surface', ], 'desc':"...", }, 'dress' :{ 'type':"wearable" , 'subtype':"clothing" , 'tags':[ ], 'desc':"...", }, 'drink' :{ 'type':"consumable" , 'subtype':"drink" , 'tags':[ ], 'desc':"...", }, 'DVD' :{ 'type':"media" , 'subtype':"video" , 'tags':[ 'DVD', ], 'desc':"...", }, 'earrings' :{ 'type':"wearable" , 'subtype':"jewelry" , 'tags':[ ], 'desc':"...", }, 'engine oil' :{ 'type':"" , 'subtype':"" , 'tags':[ ], 'desc':"...", }, 'fastener' :{ 'type':"" , 'subtype':"" , 'tags':[ ], 'desc':"...", }, 'flooring' :{ 'type':"" , 'subtype':"" , 'tags':[ ], 'desc':"...", }, 'food' :{ 'type':"consumable" , 'subtype':"food" , 'tags':[ ], 'desc':"...", }, 'frozen food' :{ 'type':"consumable" , 'subtype':"food" , 'tags':[ ], 'desc':"...", }, 'game' :{ 'type':"media" , 'subtype':"playable" , 'tags':[ ], 'desc':"...", }, 'glasses' :{ 'type':"wearable" , 'subtype':"gadget" , 'tags':[ ], 'desc':"...", }, 'gloves' :{ 'type':"wearable" , 'subtype':"gadget" , 'tags':[ ], 'desc':"...", }, 'hairstyle' :{ 'type':"styling" , 'subtype':"hair" , 'tags':[ ], 'desc':"...", }, 'handbag' :{ 'type':"wearable" , 'subtype':"bag" , 'tags':[ ], 'desc':"...", }, 'hard food' :{ 'type':"consumable" , 'subtype':"food" , 'tags':[ 'dehydrated', ], 'desc':"...", }, 'hat' :{ 'type':"wearable" , 'subtype':"clothing" , 'tags':[ ], 'desc':"...", }, 'headband' :{ 'type':"wearable" , 'subtype':"gadget" , 'tags':[ ], 'desc':"...", }, 'hygiene' :{ 'type':"hygiene" , 'subtype':"general" , 'tags':[ ], 'desc':"...", }, 'jacket' :{ 'type':"wearable" , 'subtype':"clothing" , 'tags':[ ], 'desc':"...", }, 'magazine' :{ 'type':"media" , 'subtype':"readable" , 'tags':[ ], 'desc':"...", }, 'makeup' :{ 'type':"styling" , 'subtype':"face" , 'tags':[ ], 'desc':"...", }, 'mask' :{ 'type':"wearable" , 'subtype':"gadget" , 'tags':[ ], 'desc':"...", }, 'nailpolish' :{ 'type':"styling" , 'subtype':"nails" , 'tags':[ ], 'desc':"...", }, 'necklace' :{ 'type':"wearable" , 'subtype':"jewelry" , 'tags':[ ], 'desc':"...", }, 'onepiece' :{ 'type':"wearable" , 'subtype':"clothing" , 'tags':[ ], 'desc':"...", }, 'overshirt' :{ 'type':"wearable" , 'subtype':"clothing" , 'tags':[ ], 'desc':"...", }, 'panties' :{ 'type':"wearable" , 'subtype':"clothing" , 'tags':[ ], 'desc':"...", }, 'pants' :{ 'type':"wearable" , 'subtype':"clothing" , 'tags':[ ], 'desc':"...", }, 'part' :{ 'type':"" , 'subtype':"" , 'tags':[ ], 'desc':"...", }, 'phone' :{ 'type':"mobile" , 'subtype':"gadget" , 'tags':[ 'phone', ], 'desc':"...", }, 'plant' :{ 'type':"" , 'subtype':"" , 'tags':[ ], 'desc':"...", }, 'plumbing' :{ 'type':"" , 'subtype':"" , 'tags':[ ], 'desc':"...", }, 'powder' :{ 'type':"" , 'subtype':"" , 'tags':[ ], 'desc':"...", }, 'raw meat' :{ 'type':"consumable" , 'subtype':"food" , 'tags':[ 'raw', 'meat', ], 'desc':"...", }, 'ring' :{ 'type':"wearable" , 'subtype':"jewelry" , 'tags':[ ], 'desc':"...", }, 'sash' :{ 'type':"wearable" , 'subtype':"jewelry" , 'tags':[ ], 'desc':"...", }, 'seed' :{ 'type':"" , 'subtype':"" , 'tags':[ ], 'desc':"...", }, 'shelf' :{ 'type':"furniture" , 'subtype':"" , 'tags':[ ], 'desc':"...", }, 'shirt' :{ 'type':"wearable" , 'subtype':"clothing" , 'tags':[ ], 'desc':"...", }, 'shoes' :{ 'type':"wearable" , 'subtype':"gadget" , 'tags':[ ], 'desc':"...", }, 'shorts' :{ 'type':"wearable" , 'subtype':"clothing" , 'tags':[ ], 'desc':"...", }, 'skirt' :{ 'type':"wearable" , 'subtype':"clothing" , 'tags':[ ], 'desc':"...", }, 'smartphone' :{ 'type':"mobile" , 'subtype':"gadget" , 'tags':[ 'phone', 'apps', ], 'desc':"...", }, 'socks' :{ 'type':"wearable" , 'subtype':"clothing" , 'tags':[ ], 'desc':"...", }, 'software' :{ 'type':"" , 'subtype':"" , 'tags':[ ], 'desc':"...", }, 'stand' :{ 'type':"furniture" , 'subtype':"" , 'tags':[ 'surface', ], 'desc':"...", }, 'table' :{ 'type':"furniture" , 'subtype':"" , 'tags':[ 'surface', ], 'desc':"...", }, 'tool' :{ 'type':"tool" , 'subtype':"gadget" , 'tags':[ ], 'desc':"...", }, 'towel' :{ 'type':"wearable" , 'subtype':"gadget" , 'tags':[ ], 'desc':"...", }, 'undershirt' :{ 'type':"wearable" , 'subtype':"clothing" , 'tags':[ ], 'desc':"...", }, 'vest' :{ 'type':"wearable" , 'subtype':"clothing" , 'tags':[ ], 'desc':"...", }, } /* END setup.ROLES */ }>>
<<set setup.AISLES={ 'D01':{ 'name':"APPAREL", 'desc':"...", 'AISLES':{ 'D01_A01':{ 'name':"ACCESSORIES" , 'desc':"...", }, 'D01_A02':{ 'name':"ATHLETIC WEAR" , 'desc':"...", }, 'D01_A03':{ 'name':"BACKPACKS" , 'desc':"...", }, 'D01_A04':{ 'name':"COATS" , 'desc':"...", }, 'D01_A05':{ 'name':"DRESSES" , 'desc':"...", }, 'D01_A06':{ 'name':"HANDBAGS" , 'desc':"...", }, 'D01_A07':{ 'name':"HEADWEAR" , 'desc':"...", }, 'D01_A08':{ 'name':"JEWELRY" , 'desc':"...", }, 'D01_A09':{ 'name':"PANTS" , 'desc':"...", }, 'D01_A10':{ 'name':"SHIRTS" , 'desc':"...", }, 'D01_A11':{ 'name':"SHOES" , 'desc':"...", }, 'D01_A12':{ 'name':"SWIMWEAR" , 'desc':"...", }, 'D01_A13':{ 'name':"UNDERWEAR" , 'desc':"...", }, }, }, /* END APPAREL */ 'D02':{ 'name':"AUTOMOTIVE", 'desc':"...", 'AISLES':{ 'D02_A01':{ 'name':"ACCESSORIES" , 'desc':"...", }, 'D02_A02':{ 'name':"FLUIDS" , 'desc':"...", }, 'D02_A03':{ 'name':"PARTS" , 'desc':"...", }, 'D02_A04':{ 'name':"TOOLS" , 'desc':"...", }, }, }, /* END AUTOMOTIVE */ 'D03':{ 'name':"ELECTRONICS", 'desc':"...", 'AISLES':{ 'D03_A01':{ 'name':"APPLIANCES" , 'desc':"...", }, 'D03_A02':{ 'name':"BOOKS" , 'desc':"...", }, 'D03_A03':{ 'name':"CELL PHONES" , 'desc':"...", }, 'D03_A04':{ 'name':"COMPUTER ACCESSORIES" , 'desc':"...", }, 'D03_A05':{ 'name':"COMPUTERS" , 'desc':"...", }, 'D03_A06':{ 'name':"MAGAZINES" , 'desc':"...", }, 'D03_A07':{ 'name':"MOVIES" , 'desc':"...", }, 'D03_A08':{ 'name':"MUSIC" , 'desc':"...", }, 'D03_A09':{ 'name':"SOFTWARE" , 'desc':"...", }, 'D03_A10':{ 'name':"VIDEO GAMES" , 'desc':"...", }, }, }, /* END ELECTRONICS */ 'D04':{ 'name':"FURNITURE", 'desc':"...", 'AISLES':{ 'D04_A01':{ 'name':"CARPETS" , 'desc':"...", }, 'D04_A02':{ 'name':"CHAIRS" , 'desc':"...", }, 'D04_A03':{ 'name':"DESKS" , 'desc':"...", }, 'D04_A04':{ 'name':"SHELVES" , 'desc':"...", }, 'D04_A05':{ 'name':"TABLES" , 'desc':"...", }, }, }, /* END FURNITURE */ 'D05':{ 'name':"GROCERY", 'desc':"...", 'AISLES':{ 'D05_A01':{ 'name':"ALCOHOL" , 'desc':"...", }, 'D05_A02':{ 'name':"BAKED GOODS" , 'desc':"...", }, 'D05_A03':{ 'name':"BAKING" , 'desc':"...", }, 'D05_A04':{ 'name':"BEVERAGES" , 'desc':"...", }, 'D05_A05':{ 'name':"CANDY" , 'desc':"...", }, 'D05_A06':{ 'name':"CANNED GOODS" , 'desc':"...", }, 'D05_A07':{ 'name':"CEREAL" , 'desc':"...", }, 'D05_A08':{ 'name':"DAIRY" , 'desc':"...", }, 'D05_A09':{ 'name':"DELI" , 'desc':"...", }, 'D05_A10':{ 'name':"FROZEN" , 'desc':"...", }, 'D05_A11':{ 'name':"GRAINS & PASTA" , 'desc':"...", }, 'D05_A12':{ 'name':"MEATS" , 'desc':"...", }, 'D05_A13':{ 'name':"PRODUCE" , 'desc':"...", }, 'D05_A14':{ 'name':"SNACKS" , 'desc':"...", }, }, }, /* END GROCERY */ 'D06':{ 'name':"GARDEN", 'desc':"...", 'AISLES':{ 'D06_A01':{ 'name':"MASONRY" , 'desc':"...", }, 'D06_A02':{ 'name':"PATIO FURNITURE" , 'desc':"...", }, 'D06_A03':{ 'name':"POTS" , 'desc':"...", }, 'D06_A04':{ 'name':"PLANTS" , 'desc':"...", }, 'D06_A05':{ 'name':"SEEDS" , 'desc':"...", }, 'D06_A06':{ 'name':"SOIL" , 'desc':"...", }, }, }, /* END GARDEN */ 'D07':{ 'name':"HARDWARE", 'desc':"...", 'AISLES':{ 'D07_A01':{ 'name':"BITS & BOLTS" , 'desc':"...", }, 'D07_A02':{ 'name':"ELECTRICAL" , 'desc':"...", }, 'D07_A03':{ 'name':"FIXTURES" , 'desc':"...", }, 'D07_A04':{ 'name':"HVAC" , 'desc':"...", }, 'D07_A05':{ 'name':"PLUMBING" , 'desc':"...", }, 'D07_A06':{ 'name':"POOL" , 'desc':"...", }, 'D07_A07':{ 'name':"TOOLS" , 'desc':"...", }, }, }, /* END HARDWARE */ 'D08':{ 'name':"HOUSEHOLD", 'desc':"...", 'AISLES':{ 'D08_A01':{ 'name':"APPLIANCES" , 'desc':"...", }, 'D08_A02':{ 'name':"BEDDING" , 'desc':"...", }, 'D08_A03':{ 'name':"BOARDGAMES" , 'desc':"...", }, 'D08_A04':{ 'name':"CLEANERS" , 'desc':"...", }, 'D08_A05':{ 'name':"COOKWARE" , 'desc':"...", }, 'D08_A06':{ 'name':"CRAFTS" , 'desc':"...", }, 'D08_A07':{ 'name':"DISHES" , 'desc':"...", }, 'D08_A08':{ 'name':"FLOOR CARE" , 'desc':"...", }, 'D08_A09':{ 'name':"LINENS" , 'desc':"...", }, 'D08_A10':{ 'name':"PAPER GOODS" , 'desc':"...", }, 'D08_A11':{ 'name':"STORAGE" , 'desc':"...", }, 'D08_A12':{ 'name':"TOYS" , 'desc':"...", }, 'D08_A13':{ 'name':"WINDOWS" , 'desc':"...", }, }, }, /* END HOUSEHOLD */ 'D09':{ 'name':"HYGIENE", 'desc':"...", 'AISLES':{ 'D09_A01':{ 'name':"GENERAL" , 'desc':"...", }, 'D09_A02':{ 'name':"HAIR CARE" , 'desc':"...", }, 'D09_A03':{ 'name':"MAKEUP" , 'desc':"...", }, 'D09_A04':{ 'name':"NAILS" , 'desc':"...", }, 'D09_A05':{ 'name':"ORAL CARE" , 'desc':"...", }, 'D09_A06':{ 'name':"PERSONAL CARE" , 'desc':"...", }, 'D09_A07':{ 'name':"SKIN CARE" , 'desc':"...", }, }, }, /* END HYGIENE */ 'D10':{ 'name':"OFFICE", 'desc':"...", 'AISLES':{ 'D10_A01':{ 'name':"BINDINGS" , 'desc':"...", }, 'D10_A02':{ 'name':"BRIEFCASES" , 'desc':"...", }, 'D10_A03':{ 'name':"FILE CABINETS" , 'desc':"...", }, 'D10_A04':{ 'name':"LUGGAGE" , 'desc':"...", }, 'D10_A05':{ 'name':"NOTEBOOKS" , 'desc':"...", }, 'D10_A06':{ 'name':"PAPER" , 'desc':"...", }, 'D10_A07':{ 'name':"TOOLS" , 'desc':"...", }, 'D10_A08':{ 'name':"WRITING" , 'desc':"...", }, }, }, /* END PHARMACY */ 'D11':{ 'name':"PHARMACY", 'desc':"...", 'AISLES':{ 'D11_A01':{ 'name':"COUNTER" , 'desc':"...", }, 'D11_A02':{ 'name':"FIRST AID" , 'desc':"...", }, 'D11_A03':{ 'name':"GADGETS" , 'desc':"...", }, 'D11_A04':{ 'name':"HEAD & FLU" , 'desc':"...", }, 'D11_A05':{ 'name':"SUPPLEMENTS" , 'desc':"...", }, }, }, /* END PHARMACY */ 'D12':{ 'name':"SEASONAL", 'desc':"...", 'AISLES':{ 'D12_A01':{ 'name':"VALENTINES" , 'desc':"...", }, 'D12_A02':{ 'name':"ST PADDYS/EASTER" , 'desc':"...", }, 'D12_A03':{ 'name':"SUMMER/JULY 4th" , 'desc':"...", }, 'D12_A04':{ 'name':"BACK TO SCHOOL" , 'desc':"...", }, 'D12_A05':{ 'name':"HALLOWEEN" , 'desc':"...", }, 'D12_A06':{ 'name':"THANKSGIVING" , 'desc':"...", }, 'D12_A07':{ 'name':"BLACK FRIDAY" , 'desc':"...", }, 'D12_A08':{ 'name':"XMAS/NEW YEAR" , 'desc':"...", }, }, }, /* END SEASONAL & PROMOTIONAL */ 'D13':{ 'name':"SPORTING GOODS", 'desc':"...", 'AISLES':{ 'D13_A01':{ 'name':"BIKING" , 'desc':"...", }, 'D13_A02':{ 'name':"CAMPING" , 'desc':"...", }, 'D13_A03':{ 'name':"EXERCISE MACHINES" , 'desc':"...", }, 'D13_A04':{ 'name':"FISHING" , 'desc':"...", }, 'D13_A05':{ 'name':"GADGETS" , 'desc':"...", }, 'D13_A06':{ 'name':"HUNTING" , 'desc':"...", }, 'D13_A07':{ 'name':"KEYS" , 'desc':"...", }, 'D13_A08':{ 'name':"SPORTS EQUIPMENT" , 'desc':"...", }, 'D13_A09':{ 'name':"WEIGHTS" , 'desc':"...", }, }, }, /* END SPORTING GOODS */ /* END setup.AISLES */ }>>
<<set setup.CHARS['Cindy Phoenix'] = { '_':{ 'build_lv':'public', }, 'ABOUT':{ 'who_is':'aspiring actress', }, 'BODY':{ 'Calves' :{ 'train':2.4, 'damage':0.0, }, 'Quads' :{ 'train':2.2, 'damage':0.0, }, 'Hams' :{ 'train':2.1, 'damage':0.0, }, 'Glutes' :{ 'train':2.4, 'damage':0.0, }, 'Hips' :{ 'train':2.2, 'damage':0.0, }, 'LoBack' :{ 'train':2.1, 'damage':0.0, }, 'Lats' :{ 'train':2.1, 'damage':0.0, }, 'Traps' :{ 'train':2.1, 'damage':0.0, }, 'Abs' :{ 'train':2.6, 'damage':0.0, }, 'Pecs' :{ 'train':2.1, 'damage':0.0, }, 'Delts' :{ 'train':2.4, 'damage':0.0, }, 'LeftTri' :{ 'train':2.0, 'damage':0.0, }, 'RightTri' :{ 'train':2.0, 'damage':0.0, }, 'LeftBi' :{ 'train':2.1, 'damage':0.0, }, 'RightBi' :{ 'train':2.1, 'damage':0.0, }, 'LeftFore' :{ 'train':2.1, 'damage':0.0, }, 'RightFore' :{ 'train':2.1, 'damage':0.0, }, 'LeftGrip' :{ 'train':2.1, 'damage':0.0, }, 'RightGrip' :{ 'train':2.1, 'damage':0.0, }, 'Cardio' :{ 'train':3.0, 'damage':0.8, }, 'Kegel' :{ 'train':2.4, 'damage':0.0, }, 'Brain' :{ 'train':3.0, 'damage':0.6, }, }, 'DEVICES':{}, 'ENEMIES':{}, 'EQUIP':{ /* SLOT:ID */ 'bra' :"D01_A13_I02", 'panties' :"D01_A13_I03", 'pants' :"D01_A09_I02", 'overshirt' :"D01_A10_I01", 'socks' :"D01_A13_I01", }, 'EXSLAVES':{}, 'FRIENDS':{}, 'JUNK':{}, 'LIMBS':{ 'ARML':{ 'total': 8.0, 'min': 8.0, 'parts': 8.0, 'avg':1.0, 'pct':1.0, }, 'ARMR':{ 'total': 8.0, 'min': 8.0, 'parts': 8.0, 'avg':1.0, 'pct':1.0, }, 'ARMS':{ 'total':12.0, 'min':12.0, 'parts':12.0, 'avg':1.0, 'pct':1.0, }, 'CORE':{ 'total': 5.0, 'min': 5.0, 'parts': 5.0, 'avg':1.0, 'pct':1.0, }, 'LEGL':{ 'total': 6.0, 'min': 6.0, 'parts': 6.0, 'avg':1.0, 'pct':1.0, }, 'LEGR':{ 'total': 6.0, 'min': 6.0, 'parts': 6.0, 'avg':1.0, 'pct':1.0, }, 'LEGS':{ 'total': 6.0, 'min': 6.0, 'parts': 6.0, 'avg':1.0, 'pct':1.0, }, 'SEXX':{ 'total': 7.0, 'min': 7.0, 'parts': 7.0, 'avg':1.0, 'pct':1.0, }, }, 'LOVERS':{}, 'M':{ 'WEIGHT' :{ 'BODY' :{ 'bone' : 7.00, 'fat' : 46.00, 'muscle' : - 13.00, 'organs' : 30.00, }, 'CACHE' :{}, 'CALC' :{ 'scale' : 0.92, 'fatPct' : 0.25, 'musclePct' : 0.30, 'tonePct' : 0.20, 'bmi' : 20.00, }, 'SCALED' :{ 'body' : 98.0, }, 'updated' : Date.now(), }, }, 'MATRIX':{ /* SECONDARY STATS - current values (renewable resources) */ 'vigor' : 10.0, /* STR+PHY - [P] stamina */ 'train' : 10.0, /* STR+WSD - [H] discipline/training */ 'tough' : 10.0, /* STR+END - [P] resistance to damage */ 'power' : 10.0, /* STR+SPD - [P] physical force/lift */ 'skill' : 10.0, /* STR+INS - [H] precision/accuracy */ 'aware' : 10.0, /* PHY+WSD - [H] alertness to environment */ 'vital' : 10.0, /* PHY+END - [P] health */ 'metab' : 10.0, /* PHY+SPD - [P] metabolism */ 'focus' : 10.0, /* PHY+INS - [H] attention to detail */ 'guard' : 10.0, /* WSD+END - [H] active defense */ 'react' : 10.0, /* WSD+SPD - [H] defensive speed/reaction time */ 'psych' : 10.0, /* WSD+INS - [M] psionic energy */ 'regen' : 10.0, /* END+SPD - [P] regeneration/healing */ 'force' : 10.0, /* END+INS - [H] force of will */ 'fight' : 10.0, /* SPD+INS - [H] offensive speed/action time */ /* RESOURCES - (non-stat/non-renewable) */ 'light' : 20.0, /* ? unit */ 'dark' : 10.0, /* ? unit */ 'kcal' : 1100, /* food calories consumed, total */ 'protein' : 20.0, /* grams consumed, nutrition */ 'sugar' : 80.0, /* grams consumed, empty calories */ 'money' : 2.89, /* */ 'petro' : 10.0, /* gallons, remaining */ }, 'METRICS':{ 'age' : 27.0, /* years */ 'base_ht' : 72.0, /* height, inches */ 'ht' : 63.0, /* height, inches */ 'bicep' : 6.0, /* inches; max-curl = power*bicep/30; reps - max/3 */ 'quads' : 13.0, /* inches; max-squat = power*quad/15; reps - max/3 */ 'chest' : 26.0, /* */ 'bust' : 0, /* base cup size */ 'cup' : "a", /* */ 'waist' : 19.0, /* */ 'hips' : 27.0, /* */ 'BMI' : 'not-set', /* */ 'bodyfat' : 'not-set', /* */ }, 'NAMES': { 'first' : "Cindy", 'full' : "Cindy Phoenix", 'birth' : "Cindy Williams", 'stage' : "Cindy Campbell", 'online' : "Cindy Phoenix", }, 'PASSAGES':{ 'start' : "START CINDY", 'home' : "LIVING IN CAR", 'travel' : "DRIVE SOMEWHERE", }, 'PLACES':{ 'GAS STATION' : { 'name':"GAS STATION", 'PASSAGE':"GAS STATION", 'visits':1, }, }, 'POWERS':{ 'xPHY':{ 'label' : 'Super-Physique', 'rank' : 3.0, }, }, 'PROPERTY':{ 'car':{}, }, 'S':{ 'STR' :{ 'base': 13.00, 'pow': 0.00, 'PERM':{}, 'TEMP':{}, '~cache':1, }, 'PHY' :{ 'base': 7.00, 'pow': 3.00, 'PERM':{}, 'TEMP':{}, '~cache':1, }, 'WSD' :{ 'base': 17.00, 'pow': 0.00, 'PERM':{}, 'TEMP':{}, '~cache':1, }, 'END' :{ 'base': 13.00, 'pow': 0.00, 'PERM':{}, 'TEMP':{}, '~cache':1, }, 'SPD' :{ 'base': 14.00, 'pow': 0.00, 'PERM':{}, 'TEMP':{}, '~cache':1, }, 'INS' :{ 'base': 17.00, 'pow': 0.00, 'PERM':{}, 'TEMP':{}, '~cache':1, }, 'CALC' :{ 'Lv' : 15.00, 'Cal' : 5.00, 'Mag' : 2.00, 'Cap' : 7.00, 'workout_hrs' : 7.00, 'light_well' : 7.00, 'dark_well' : 7.00, }, }, 'SKILLS':{}, 'SLAVES':{}, 'STATE':{ 'saveVersion' : 0.258, 'feedbackQueue' : [], 'Date' : new Date(), 'lastPassage' : null, 'lastExercise' : null, 'lastActivity' : null, 'lastAction' : null, 'lastItem' : null, }, 'STATUS':{}, 'STUFF':{ /* lost everything but the clothes on her back! (and whatever is in the trunk of her car) */ /* ID:uses */ 'D01_A01_I02': 30, /* hair-tyes */ 'D01_A09_I02': 60, /* jeans */ 'D01_A10_I01': 30, /* blouse */ 'D01_A13_I02': 50, /* plain white bra */ 'D01_A13_I03': 50, /* plain white panties */ 'D01_A13_I01': 13, /* ankle socks */ 'D05_A05_I01': 1, /* chocolate bar */ 'D08_A09_I03': 30, /* washcloth */ }, 'TRAITS':{ 'gender' : "female", 'species' : "human", /* 'skin_type' : "", */ /* 'skin_color' : "", */ /* 'skin_condition' : "", */ /* 'hair_length' : "", */ /* 'hair_color' : "", */ /* 'hair_style' : "", */ /* 'hair_condition' : "", */ /* 'eye_color' : "", */ /* 'eye_condition' : "", */ /* 'face' : "", */ }, /* END setup.CHARS['Cindy Phoenix'] */ }>>
<<set setup.PASSAGES={ /* EXERCISES */ 'GO FOR A WALK' :{ 'setup' : function() { $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('walking'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return "<<include 'POST WORKOUT'>>"; }, 'ENCOUNTERS':{ 'nothing' : function() { return 50; }, 'bill_RANDOM' : function() { return 10; }, 'wallet_RANDOM' : function() { return 4; }, 'cart_RANDOM' : function() { return ($G.PC.PASSAGES.home=='LIVING IN CAR' ? 10 : 0); }, 'car_RANDOM' : function() { return 5; }, 'stalker' : function() { return 4; }, 'enemy' : function() { return $G.PC.ENEMIES.length/2; }, }, }, 'GO FOR A JOG' :{ 'setup' : function() { $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('jogging'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return "<<include 'POST WORKOUT'>>"; }, 'ENCOUNTERS':{ 'nothing' : function() { return 60; }, 'bill_RANDOM' : function() { return 10; }, 'wallet_RANDOM' : function() { return 3; }, 'cart_RANDOM' : function() { return ($G.PC.PASSAGES.home=='LIVING IN CAR' ? 10 : 0); }, 'car_RANDOM' : function() { return 5; }, 'stalker' : function() { return 3; }, 'enemy' : function() { return $G.PC.ENEMIES.length/3; }, }, }, 'GO FOR A RUN' :{ 'setup' : function() { $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('running'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return "<<include 'POST WORKOUT'>>"; }, 'ENCOUNTERS':{ 'nothing' : function() { return 70; }, 'bill_RANDOM' : function() { return 10; }, 'wallet_RANDOM' : function() { return 2; }, 'cart_RANDOM' : function() { return ($G.PC.PASSAGES.home=='LIVING IN CAR' ? 10 : 0); }, 'car_RANDOM' : function() { return 5; }, 'stalker' : function() { return 2; }, 'enemy' : function() { return 1; }, }, }, 'DO AEROBICS' :{ 'setup' : function() { $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('aerobicising to the beat','working out'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return "<<include 'POST WORKOUT'>>"; }, 'ENCOUNTERS':{ 'nothing' : function() { return 10; }, }, }, 'DO CALISTHENICS' :{ 'setup' : function() { $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('doing your calisthenics routine'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return "<<include 'POST WORKOUT'>>"; }, 'ENCOUNTERS':{ 'nothing' : function() { return 10; }, }, }, 'DO YOGA' :{ 'setup' : function() { $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('doing yoga', 'stretching'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return "<<include 'POST WORKOUT'>>"; }, 'ENCOUNTERS':{ 'nothing' : function() { return 10; }, }, }, 'PUSH YOURSELF' :{ 'setup' : function() { switch($G.PC.STATE.lastPassage) { case 'GO FOR A WALK': case 'GO FOR A JOG': case 'GO FOR A RUN': State.setVar( '_outdoors', true ); break; default: State.setVar( '_outdoors', false ); break; } $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('pushing yourself to the limit','trying to kill yourself'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return " <p></p> <p></p> <p class='keypress' key='[SPACE]'>[[CONTINUE->GO HOME]]</p> "; }, 'ENCOUNTERS':{ 'nothing' : function() { return 50; }, 'bill_RANDOM' : function() { return (_outdoors ? 10 : 0); }, 'wallet_RANDOM' : function() { return (_outdoors ? 2 : 0); }, 'cart_RANDOM' : function() { return ((_outdoors && $G.PC.PASSAGES.home=='LIVING IN CAR') ? 10 : 0); }, 'car_RANDOM' : function() { return (_outdoors ? 5 : 0); }, 'stalker' : function() { return (_outdoors ? 15 : 0); }, 'enemy' : function() { return (_outdoors ? $G.PC.ENEMIES.length*2 : 0); }, }, }, /* v0.3 */ 'GYM' :{ 'setup' : function() { $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('at the gym','getting ready for a workout'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return " <<if setup.ALIAS.canDo('EXPLORE', 'search', 10/60, 1.0, $G.PC)>> <p class='keypress' key='[SPACE]'><<link 'EXPLORE THE GYM'>><<run setup.ALIAS.passTime(setup.ALIAS.rand(3,15)/60, $G.PC);>><<print setup.ALIAS.reloadPassage();>><</link>></p> <</if>> <p class='keypress' key='[ESC]'><<print setup.ALIAS.carOrCab($G.PC);>></p> "; }, 'ENCOUNTERS':{ 'nothing' : function() { return 320; }, 'gym-patron' : function() { return 32 * setup.ALIAS.worldVarGet('rate.encounters.gym'); }, 'gym: bodybuilder' : function() { return 16 * setup.ALIAS.worldVarGet('rate.encounters.gym'); }, 'gym: out-of-shape' : function() { return 36 * setup.ALIAS.worldVarGet('rate.encounters.gym'); }, 'gym: meat-head' : function() { return 8 * setup.ALIAS.worldVarGet('rate.encounters.gym'); }, 'gym: athlete' : function() { return 24 * setup.ALIAS.worldVarGet('rate.encounters.gym'); }, 'gym: townsfolk' : function() { return 48 * setup.ALIAS.worldVarGet('rate.encounters.gym'); }, 'gym: staff' : function() { return 32 * setup.ALIAS.worldVarGet('rate.encounters.gym'); }, 'enemy' : function() { return $G.PC.ENEMIES.length*0.85 * setup.ALIAS.worldVarGet('rate.encounters.gym') * setup.ALIAS.worldVarGet('game.difficulty.level'); }, 'stalker' : function() { return 2 * setup.ALIAS.worldVarGet('rate.encounters.gym') * setup.ALIAS.worldVarGet('game.difficulty.level'); }, 'bill_RANDOM' : function() { return 0 / setup.ALIAS.worldVarGet('game.difficulty.level'); /* encounter needs to be fixed for non S-Mart locations... */ }, 'wallet_RANDOM' : function() { return 0 / setup.ALIAS.worldVarGet('game.difficulty.level'); /* encounter needs to be fixed for non S-Mart locations... */ }, }, /* planning-only, not yet implemented... gym has 2 main shifts, and an overlap */ 'SCHEDULE':{ 'OPENING':{ 'start' :'05:00', 'end' :'05:30', 'locked' :true, 'staff' :true, }, 'OPEN':{ 'start' :'05:30', 'end' :'20:30', 'locked' :false, 'staff' :true, }, 'CLOSING':{ 'start' :'20:30', 'end' :'21:00', 'locked' :false, 'staff' :true, }, 'CLOSED':{ 'start' :'22:00', 'end' :'05:00', 'locked' :true, 'staff' :false, }, }, /* planning-only, not yet implemented... gym has 2 main shifts, and an overlap */ 'NPCS':{ /* replace with UID designations */ 'Katie':{}, }, }, 'RIVERSIDE PARK' :{ 'setup' : function() { $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('in the park'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return " <<if setup.ALIAS.canDo('EXPLORE', 'search', 10/60, 1.0, $G.PC)>> <p class='keypress' key='[SPACE]'><<link 'EXPLORE THE PARK'>><<run setup.ALIAS.passTime(setup.ALIAS.rand(3,15)/60, $G.PC);>><<print setup.ALIAS.reloadPassage();>><</link>></p> <</if>> <p class='keypress' key='[ESC]'><<print setup.ALIAS.carOrCab($G.PC);>></p> "; }, 'ENCOUNTERS':{ 'nothing' : function() { return 124; }, 'stalker' : function() { return 24 *(0.16*$G.PC.STATE.WEATHER.Daylight) * setup.ALIAS.worldVarGet('game.difficulty.level'); }, 'enemy' : function() { return $G.PC.ENEMIES.length * setup.ALIAS.worldVarGet('game.difficulty.level'); }, 'bill_RANDOM' : function() { return 0 / setup.ALIAS.worldVarGet('game.difficulty.level'); /* encounter needs to be fixed for non S-Mart locations... */ }, 'wallet_RANDOM' : function() { return 0 / setup.ALIAS.worldVarGet('game.difficulty.level'); /* encounter needs to be fixed for non S-Mart locations... */ }, 'jogger' : function() { return 24 *($G.PC.STATE.WEATHER.Daylight); }, 'vampire' : function() { return 24 *(1.0-($G.PC.STATE.WEATHER.Daylight**0.1)) * setup.ALIAS.worldVarGet('game.difficulty.level'); }, 'nymph' : function() { return 1 *($G.PC.STATE.WEATHER.Daylight); }, 'succubus' : function() { return 1 *(1.0-($G.PC.STATE.WEATHER.Daylight**0.1)); }, 'litter' : function() { return 3 *($G.PC.STATE.WEATHER.Daylight); }, 'rift' : function() { return 3 *(1.0-($G.PC.STATE.WEATHER.Daylight**0.1)); }, 'demon' : function() { return 1 * setup.ALIAS.worldVarGet('game.difficulty.level'); }, 'cave' : function() { return 3; }, 'parkhaven' : function() { return 24 *(setup.ALIAS.worldVarGet('parkhaven.mentioned') ? 1.0 : 0.1 ) *(setup.ALIAS.location_known('PARKHAVEN') ? 0.0 : 1.0 ); }, }, }, 'PARKHAVEN' :{ 'setup' : function() { $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('browsing'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return "<<print setup.ALIAS.carOrCab($G.PC);>>"; }, 'ENCOUNTERS':{ 'nothing' : function() { return 72; }, }, }, 'GAS STATION' :{ 'setup' : function() { $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('at the gas station','getting gas'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return " <<if setup.ALIAS.canDo('EXPLORE', 'search', 10/60, 1.0, $G.PC)>> <p class='keypress' key='[SPACE]'><<link 'EXPLORE THE STATION'>><<run setup.ALIAS.passTime(setup.ALIAS.rand(3,15)/60, $G.PC);>><<print setup.ALIAS.reloadPassage();>><</link>></p> <</if>> <p class='keypress' key='[ESC]'><<print setup.ALIAS.carOrCab($G.PC);>></p> "; }, 'ENCOUNTERS':{ 'nothing' : function() { return 72; }, 'customer' : function() { return 16; }, }, }, 'MOTEL' :{ 'setup' : function() { $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('at the motel','checking in'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return " <<if setup.ALIAS.canDo('EXPLORE', 'search', 10/60, 1.0, $G.PC)>> <p class='keypress' key='[SPACE]'><<link 'EXPLORE THE MOTEL'>><<run setup.ALIAS.passTime(setup.ALIAS.rand(3,15)/60, $G.PC);>><<print setup.ALIAS.reloadPassage();>><</link>></p> <</if>> <p class='keypress' key='[ESC]'><<print setup.ALIAS.carOrCab($G.PC);>></p> "; }, 'ENCOUNTERS':{ 'nothing' : function() { return 72; }, 'customer' : function() { return 16; }, }, }, 'DINER' :{ 'setup' : function() { $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('at the diner','waiting to be seated','waiting for your food','eating'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return " <<if setup.ALIAS.canDo('EXPLORE', 'search', 10/60, 1.0, $G.PC)>> <p class='keypress' key='[SPACE]'><<link 'EXPLORE THE DINER'>><<run setup.ALIAS.passTime(setup.ALIAS.rand(3,15)/60, $G.PC);>><<print setup.ALIAS.reloadPassage();>><</link>></p> <</if>> <p class='keypress' key='[ESC]'><<print setup.ALIAS.carOrCab($G.PC);>></p> "; }, 'ENCOUNTERS':{ 'nothing' : function() { return 72; }, 'customer' : function() { return 16; }, }, }, 'RIVERVALLEY HIGH' :{ 'setup' : function() { $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('at school'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return " <<if setup.ALIAS.canDo('EXPLORE', 'search', 10/60, 1.0, $G.PC)>> <p class='keypress' key='[SPACE]'><<link 'EXPLORE THE SCHOOL'>><<run setup.ALIAS.passTime(setup.ALIAS.rand(3,15)/60, $G.PC);>><<print setup.ALIAS.reloadPassage();>><</link>></p> <</if>> <p class='keypress' key='[ESC]'><<print setup.ALIAS.carOrCab($G.PC);>></p> "; }, 'ENCOUNTERS':{ /* todo: add a boatload of encounters now that combat is rarely lethal... */ 'nothing' : function() { return 72; }, 'rvh-student' : function() { return 16; }, }, /* planning-only, not yet implemented... */ 'SCHEDULE':{ 'OPENING':{ 'start' :'06:15', 'end' :'07:00', 'locked' :true, 'staff' :true, }, 'OPEN':{ 'start' :'07:00', 'end' :'21:30', 'locked' :false, 'staff' :true, }, 'CLOSING':{ 'start' :'15:15', 'end' :'17:45', 'locked' :false, 'staff' :true, }, 'CLOSED':{ 'start' :'17:45', 'end' :'06:15', 'locked' :true, 'staff' :false, }, }, /* planning-only, not yet implemented... */ 'NPCS':{ /* replace with UID designations */ 'Kyra Pyrth':{}, 'Randolph Jules':{}, 'Ed Myers':{}, }, }, 'PRISON' :{ 'setup' : function() { $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('behind bars', '"just visiting"'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return " <<if setup.ALIAS.canDo('EXPLORE', 'search', 10/60, 1.0, $G.PC)>> <p class='keypress' key='[SPACE]'><<link 'EXPLORE THE FACILITY'>><<run setup.ALIAS.passTime(setup.ALIAS.rand(3,15)/60, $G.PC);>><<print setup.ALIAS.reloadPassage();>><</link>></p> <</if>> <p class='keypress' key='[ESC]'><<print setup.ALIAS.carOrCab($G.PC);>></p> "; }, 'ENCOUNTERS':{ /* todo: add a boatload of encounters now that combat is rarely lethal... */ 'nothing' : function() { return 72; }, 'inmate' : function() { return 16; }, }, /* planning-only, not yet implemented... */ 'SCHEDULE':{}, /* planning-only, not yet implemented... */ 'NPCS':{ /* replace with UID designations */ }, }, 'GO HOME' :{ 'setup' : function() { $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('home','heading home'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return " <<set _home=$G.PC.PASSAGES.home>> <<include 'STATS'>><<include 'RESOURCES'>><<include _home>> "; }, 'ENCOUNTERS':{ 'nothing' : function() { return 10; }, }, }, 'LIVING ON STREET' :{ 'setup' : function() { $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('on the street'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return ""; }, 'ENCOUNTERS':{ 'nothing' : function() { return 10; }, }, }, 'LIVING IN PRISON' :{ 'setup' : function() { $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('in your cell','in the yard','in laundry','going to chow','in class','working','working out','in the gym','in the weightroom','waiting in line','talking to your counselor'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return ""; }, 'ENCOUNTERS':{ 'nothing' : function() { return 10; }, }, }, 'LIVING IN CAR' :{ 'setup' : function() { $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('in your car','sitting there','sitting there listening to the radio','planning your day'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return ""; }, 'ENCOUNTERS':{ 'nothing' : function() { return 10; }, }, }, 'LIVING IN MOTEL' :{ 'setup' : function() { $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('in your room','watching tv','watching the news','channel surfing'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return ""; }, 'ENCOUNTERS':{ 'nothing' : function() { return 10; }, }, }, 'SLEEP IN CAR' :{ 'setup' : function() { $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('sleeping','sleeping in your car'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return "<br/><<goto 'GO HOME'>>"; }, 'ENCOUNTERS':{ 'nothing' : function() { return 10; }, }, }, 'SLEEP IN BED' :{ 'setup' : function() { $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('sleeping','lying in bed, staing at the ceiling'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return "<br/><<goto 'GO HOME'>>"; }, 'ENCOUNTERS':{ 'nothing' : function() { return 10; }, }, }, 'REST A BIT' :{ 'setup' : function() { $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('resting','recovering from your workout','catching your breath'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return "<br/><<goto 'GO HOME'>>"; }, 'ENCOUNTERS':{ 'nothing' : function() { return 10; }, }, }, 'TAKE A NAP' :{ 'setup' : function() { $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('napping','snoozing','snoring','resting','recovering from your workout','catching your breath'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return "<br/><<goto 'GO HOME'>>"; }, 'ENCOUNTERS':{ 'nothing' : function() { return 10; }, }, }, 'LOOK FOR CHANGE' :{ 'setup' : function() { $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('scrounging the parking lot','looking for change'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return " <<if setup.ALIAS.canDo('EXPLORE', 'search', 30/60, 1.0, $G.PC)>> <p class='keypress' key='[SPACE]'><<link 'KEEP LOOKING'>><<goto 'LOOK FOR CHANGE'>><</link>></p> <</if>> <p class='keypress' key='[ESC]'>[[GO HOME]]</p> "; }, 'ENCOUNTERS':{ 'nothing' : function() { return 125; }, 'bill_RANDOM' : function() { return 35 / setup.ALIAS.worldVarGet('game.difficulty.level'); }, 'wallet_RANDOM' : function() { return 16 / setup.ALIAS.worldVarGet('game.difficulty.level'); }, 'cart_RANDOM' : function() { return 24 / setup.ALIAS.worldVarGet('game.difficulty.level'); }, 'car_RANDOM' : function() { return 35; }, 'stalker' : function() { return 8 * setup.ALIAS.worldVarGet('game.difficulty.level'); }, 'enemy' : function() { return $G.PC.ENEMIES.length * setup.ALIAS.worldVarGet('game.difficulty.level'); }, /* if you had ever seen a vampire, you would stay indoors at night... */ 'vampire' : function() { return 1.5*(1.0-($G.PC.STATE.WEATHER.Daylight**0.1))*(setup.ALIAS.worldVarGet('seen.vampire') ?1 :0) * setup.ALIAS.worldVarGet('game.difficulty.level'); }, }, }, /*S-MART*/ 'S-MART' :{ 'setup' : function() { $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('shopping','browsing'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return " <<if setup.ALIAS.canDo('EXPLORE', 'search', 10/60, 1.0, $G.PC)>> <p class='keypress' key='[SPACE]'><<link 'EXPLORE S-MART'>><<run setup.ALIAS.passTime(setup.ALIAS.rand(3,15)/60, $G.PC);>><<print setup.ALIAS.reloadPassage();>><</link>></p> <</if>> <p class='keypress' key='[ESC]'><<print setup.ALIAS.carOrCab($G.PC);>></p> "; }, 'ENCOUNTERS':{ 'nothing' : function() { return 72; }, 'customer' : function() { return 16; }, }, }, 'CHECKOUT APPAREL' :{ 'setup' : function() { var dept = either('apparel',( _aisle ? setup.ALIAS.getAisleName(_aisle) : 'stuff'),'clothing'); $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('shopping','browsing','checking out '+dept,'checking out the '+dept+' department'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return " <p></p> <p></p> <p class='keypress' key='[ESC]'>[[CHECK OUT ANOTHER DEPARTMENT->S-MART]]</p> "; }, 'ENCOUNTERS':{ 'nothing' : function() { return 10; }, }, }, 'CHECKOUT AUTOMOTIVE' :{ 'setup' : function() { var dept = either('automotive',( _aisle ? setup.ALIAS.getAisleName(_aisle) : 'stuff'),'auto parts'); $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('shopping','browsing','checking out '+dept,'checking out the '+dept+' department'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return " <p></p> <p></p> <p class='keypress' key='[ESC]'>[[CHECK OUT ANOTHER DEPARTMENT->S-MART]]</p> "; }, 'ENCOUNTERS':{ 'nothing' : function() { return 10; }, }, }, 'CHECKOUT ELECTRONICS' :{ 'setup' : function() { var dept = either('electronics',( _aisle ? setup.ALIAS.getAisleName(_aisle) : 'stuff'),'gadgets and gizmos'); $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('shopping','browsing','checking out '+dept,'checking out the '+dept+' department'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return " <p></p> <p></p> <p class='keypress' key='[ESC]'>[[CHECK OUT ANOTHER DEPARTMENT->S-MART]]</p> "; }, 'ENCOUNTERS':{ 'nothing' : function() { return 10; }, }, }, 'CHECKOUT FURNITURE' :{ 'setup' : function() { var dept = either('furniture',( _aisle ? setup.ALIAS.getAisleName(_aisle) : 'stuff')); $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('shopping','browsing','checking out '+dept,'checking out the '+dept+' department'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return " <p></p> <p></p> <p class='keypress' key='[ESC]'>[[CHECK OUT ANOTHER DEPARTMENT->S-MART]]</p> "; }, 'ENCOUNTERS':{ 'nothing' : function() { return 10; }, }, }, 'CHECKOUT GARDEN' :{ 'setup' : function() { var dept = either('garden center',( _aisle ? setup.ALIAS.getAisleName(_aisle) : 'stuff')); $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('shopping','browsing','checking out '+dept,'checking out the '+dept+' department'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return " <p></p> <p></p> <p class='keypress' key='[ESC]'>[[CHECK OUT ANOTHER DEPARTMENT->S-MART]]</p> "; }, 'ENCOUNTERS':{ 'nothing' : function() { return 10; }, }, }, 'CHECKOUT GROCERY' :{ 'setup' : function() { var dept = either('grocery',( _aisle ? setup.ALIAS.getAisleName(_aisle) : 'stuff')); $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('shopping','browsing','checking out '+dept,'checking out the '+dept+' department'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return " <p></p> <p></p> <p class='keypress' key='[ESC]'>[[CHECK OUT ANOTHER DEPARTMENT->S-MART]]</p> "; }, 'ENCOUNTERS':{ 'nothing' : function() { return 10; }, }, }, 'CHECKOUT HARDWARE' :{ 'setup' : function() { var dept = either('hardware',( _aisle ? setup.ALIAS.getAisleName(_aisle) : 'stuff')); $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('shopping','browsing','checking out '+dept,'checking out the '+dept+' department'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return " <p></p> <p></p> <p class='keypress' key='[ESC]'>[[CHECK OUT ANOTHER DEPARTMENT->S-MART]]</p> "; }, 'ENCOUNTERS':{ 'nothing' : function() { return 10; }, }, }, 'CHECKOUT HOUSEHOLD' :{ 'setup' : function() { var dept = either('household',( _aisle ? setup.ALIAS.getAisleName(_aisle) : 'stuff'),'furnishings'); $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('shopping','browsing','checking out '+dept,'checking out the '+dept+' department'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return " <p></p> <p></p> <p class='keypress' key='[ESC]'>[[CHECK OUT ANOTHER DEPARTMENT->S-MART]]</p> "; }, 'ENCOUNTERS':{ 'nothing' : function() { return 10; }, }, }, 'CHECKOUT HYGIENE' :{ 'setup' : function() { var dept = either('hygiene',( _aisle ? setup.ALIAS.getAisleName(_aisle) : 'stuff')); $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('shopping','browsing','checking out '+dept,'checking out the '+dept+' department'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return " <p></p> <p></p> <p class='keypress' key='[ESC]'>[[CHECK OUT ANOTHER DEPARTMENT->S-MART]]</p> "; }, 'ENCOUNTERS':{ 'nothing' : function() { return 10; }, }, }, 'CHECKOUT OFFICE' :{ 'setup' : function() { var dept = either('office',( _aisle ? setup.ALIAS.getAisleName(_aisle) : 'stuff'),'office supplies'); $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('shopping','browsing','checking out '+dept,'checking out the '+dept+' department'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return " <p></p> <p></p> <p class='keypress' key='[ESC]'>[[CHECK OUT ANOTHER DEPARTMENT->S-MART]]</p> "; }, 'ENCOUNTERS':{ 'nothing' : function() { return 10; }, }, }, 'CHECKOUT PHARMACY' :{ 'setup' : function() { var dept = either('pharmacy',( _aisle ? setup.ALIAS.getAisleName(_aisle) : 'stuff')); $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('shopping','browsing','checking out '+dept,'checking out the '+dept+' department'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return " <p></p> <p></p> <p class='keypress' key='[ESC]'>[[CHECK OUT ANOTHER DEPARTMENT->S-MART]]</p> "; }, 'ENCOUNTERS':{ 'nothing' : function() { return 10; }, }, }, 'CHECKOUT SEASONAL' :{ 'setup' : function() { var dept = either('seasonal',( _aisle ? setup.ALIAS.getAisleName(_aisle) : 'stuff')); $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('shopping','browsing','checking out '+dept,'checking out the '+dept+' department'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return " <p></p> <p></p> <p class='keypress' key='[ESC]'>[[CHECK OUT ANOTHER DEPARTMENT->S-MART]]</p> "; }, 'ENCOUNTERS':{ 'nothing' : function() { return 10; }, }, }, 'CHECKOUT SPORTING GOODS' :{ 'setup' : function() { var dept = either('sporting goods',( _aisle ? setup.ALIAS.getAisleName(_aisle) : 'stuff'),'sports'); $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('shopping','browsing','checking out '+dept,'checking out the '+dept+' department'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return " <p></p> <p></p> <p class='keypress' key='[ESC]'>[[CHECK OUT ANOTHER DEPARTMENT->S-MART]]</p> "; }, 'ENCOUNTERS':{ 'nothing' : function() { return 10; }, }, }, 'ENTER BATHROOM' :{ 'setup' : function() { $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('in the bathroom'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return " <p></p> <p class='keypress' key='[ESC]'>[[LEAVE->S-MART]]</p> "; }, 'ENCOUNTERS':{ 'nothing' : function() { return 10; }, }, }, 'FILLOUT APPLICATION' :{ 'setup' : function() { $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('filling out an application'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return " <p></p> <p></p> <p class='keypress' key='[ESC]'>[[RETURN->S-MART]]</p> "; }, 'ENCOUNTERS':{ 'nothing' : function() { return 10; }, }, }, 'PROTOTYPE PASSAGE' :{ 'setup' : function() { $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('here'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return " <<if setup.ALIAS.canDo('EXPLORE', 'search', 10/60, 1.0, $G.PC)>> <p class='keypress' key='[SPACE]'><<link 'EXPLORE...'>><<run setup.ALIAS.passTime(setup.ALIAS.rand(3,15)/60, $G.PC);>><<print setup.ALIAS.reloadPassage();>><</link>></p> <</if>> <p class='keypress' key='[ESC]'><<print setup.ALIAS.carOrCab($G.PC);>></p> "; }, 'ENCOUNTERS':{ 'nothing' : function() { return 72; }, }, 'SCHEDULE':{}, 'NPCS':{}, }, /* passage:{ ENCOUNTERS:{encounter:weight} } */ }>>
<<set setup.ENCOUNTERS={ 'nothing':{ /* sub-types inline */ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, /* LOOSE BILLS */ 'bill_MASTER':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function(bill, pre, post) { pre=pre||'<p>'; post=post||'</p>'; setup.ALIAS.do_status_update($G.PC); return pre +' '+ "You find " + either( 'a 1928', 'a 1933', 'a 1946', 'a 1954', 'a 1967', 'a 1971', 'a 1978', 'a 1983', 'a 1988', 'a 1994', 'a 1997', 'a 2001', 'a 2004', 'a 2009', 'a 2013', 'a 2016', 'a 2018', 'a 2044... wait, what? 2044', 'a', 'an old', 'a clean', 'a fresh', 'a lemon scented', 'a lavender scented', 'a stained', 'a taped', 'a very old', 'a worn', 'a crumpled', 'a soggy', 'a torn', 'a dirty', 'a grimey', 'a sticky', 'a wet', 'a soggy', 'a damp', 'a faded', 'a crisp', 'a new', 'a colored in', 'a written on', 'another', 'what looks like a', ', could it be? Another', 'yet another', 'one more', 'a singed', 'a much needed', 'a desperately needed', 'a lucky', 'a cursed', 'a bloody', 'a yellowed', 'a half-buried', 'a burned' ) +" "+ bill +", " + either( 'with a corner missing, ', 'folded', 'wadded', 'crumpled', 'half-buried', 'lying flat', 'poking out', 'dropped', 'jammed', 'stuffed', 'torn', 'still smoking', 'stuck under a rock', 'stuck to a receipt', 'stuck', 'rolled up', 'carefully folded', 'lying', ) +' '+ either( 'under a tire.', 'in a basket.', 'behind the news-bin.', 'on the sidewalk.', 'in a bush.', 'in the weeds.', 'in the grass.', 'in a flower bed.', 'under a tree.', 'under a lamp post.', 'in the propane return.', 'behind a vending machine.', 'in somebody's pocket... I wonder if they noticed.', 'by the aracade.', 'in front of the Blu Box.', 'in a dusty old wallet... don&t ask where you found the wallet.', 'in the rocks.', 'in the wood chips, beneath the stop sign.', 'under a ride.', 'in a plastic bag, blowing across the lot.', 'in a paper sack... smells like cheap burbon.', 'hidden in an old hat.', 'in your pocket. Wow, where did that come from?', 'in your hand... it was there the whole time.', 'scratching your hip... wait, who put it there?', 'lying under the counter, when you stop in to use the restroom.', 'stuck to your foot.', 'under a bench', 'blowing across the parking lot, almost missed it as a gust kicked up.', 'in a tip jar.', 'in a collection jar.', 'near a school ROTC fundraiser.', 'in a blind musician's guitar case.', 'sitting on the floorboard of an unlocked car... good thing you were there to catch this, there's no telling what someone else might have done.', 'in the trash... yuck.' ) +' '+ either( '', 'Imagine that.', 'You can only imagine where it's been.', 'Huh.', 'Must be your lucky day!', 'Only 10,000 more to go...', 'That guy looks familiar.', 'You could swear you recognized that person.', 'Someone made him look like that dude from that board game... with the property...', 'You're rich!.', 'Something doesn't seem quite right.', 'You almost feel bad about it.', 'A thrilling experience!', 'Momma's gonna eat tonight!', 'It's kinda small... maybe you should throw it back?', 'This calls for celebration!', 'Someone drew a mustache.', 'Someone drew in shades... the president never looked so cool.', 'Someone drew boobs on it... actually, they did a good job.', 'Wait, is that a swastika? Where did this money come from?', 'The face is colored in.', 'Why is there gum on this?', 'Wait, was that a cop?', 'Smells like fish.', 'You've got a bad feeling about this.', 'The day's looking up!', 'It's gonna be a great day!', 'Wait, was this in the garbage?', 'You wonder what happened to it's owner.' ) +' '+ post; }, }, 'bill_1':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { $G.PC.MATRIX.money += 1.00; setup.ALIAS.karmaAdd(-0.10, $G.PC); return setup.ENCOUNTERS.bill_MASTER.afterPassage(either( "$1 bill", "$1 bill", "$1 bill", "$1 bill", "$1 bill", "$1 bill", "$1 bill", "$1 bill", "dollar", "dollar", "dollar", "dollar", "dollar bill", "dollar bill", "one dollar", "one dollar", "one dollar", "one dollar", "bill- enough to go out tonight, anywhere that has a dollar menu", "old Georgie", "Washington", "buck", "buck", "buck", "buck", "dolla", "whole hundred cents..." )); }, }, 'bill_2':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { $G.PC.MATRIX.money += 2.00; setup.ALIAS.karmaAdd(+100.0, $G.PC); return setup.ENCOUNTERS.bill_MASTER.afterPassage(either( "$2 bill", "$2 bill", "$2 bill", "two dollar bill", "two dollar bill", "T.J.", "Jefferson", "lucky $2 bill" )); }, }, 'bill_5':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { $G.PC.MATRIX.money += 5.00; setup.ALIAS.karmaAdd(-0.50, $G.PC); return setup.ENCOUNTERS.bill_MASTER.afterPassage(either( "$5 bill", "$5 bill", "$5 bill", "$5 bill", "$5 bill", "$5 bill", "$5 bill", "$5 bill", "fiver", "five", "five", "five", "bill- enough to go out tonight, at least for fast food", "five dollar bill", "five dollar bill", "Honest Abe", "Lincoln" )); }, }, 'bill_10':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { $G.PC.MATRIX.money += 10.00; setup.ALIAS.karmaAdd(-1.00, $G.PC); return setup.ENCOUNTERS.bill_MASTER.afterPassage(either( "$10 bill", "$10 bill", "$10 bill", "$10 bill", "$10 bill", "$10 bill", "$10 bill", "$10 bill", "ten", "ten", "ten", "ten", "bill- enough to go out tonight, to a small cafe", "ten dollar bill", "ten dollar bill", "my man, Xander Hami", "Hamilton", "... yeah, don't know that guy" )); }, }, 'bill_20':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { $G.PC.MATRIX.money += 20.00; setup.ALIAS.karmaAdd(-2.00, $G.PC); return setup.ENCOUNTERS.bill_MASTER.afterPassage(either( "$20 bill", "$20 bill", "$20 bill", "$20 bill", "$20 bill", "$20 bill", "$20 bill", "$20 bill", "twenty", "twenty", "bill- enough for half a tank", "bill- enough to go out tonight, to a restaurant", "twenty dollar bill", "twenty dollar bill", "Andy J", "Jackson" )); }, }, 'bill_50':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { $G.PC.MATRIX.money += 50.00; setup.ALIAS.karmaAdd(-5.00, $G.PC); return setup.ENCOUNTERS.bill_MASTER.afterPassage(either( "$50 bill", "$50 bill", "$50 bill", "$50 bill", "$50 bill", "$50 bill", "$50 bill", "$50 bill", "fifty", "fifty", "bill- enough to rent a room", "bill- enough to go out tonight, to a fancy restaurant", "fifty dollar bill", "fifty dollar bill", "Ulysses", "Grant" )); }, }, 'bill_100':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { $G.PC.MATRIX.money += 100.00; setup.ALIAS.karmaAdd(-10.00, $G.PC); return setup.ENCOUNTERS.bill_MASTER.afterPassage(either( "$100 bill", "$100 bill", "$100 bill", "$100 bill", "$100 bill", "$100 bill", "$100 bill", "$100 bill", "hundred", "hundred", "bill- your salvation", "hundred clams", "hundred dollar bill", "hundred dollar bill", "hundred bucks", "hundred bucks", "C-note", "portrait of your old friend, Ben", "Benjamin", "Franklin" )); }, }, 'bill_MULTI':{ /* run bill_RANDOM 2x ... repeatable */ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { if(!_multi) { State.setVar( '_multi', 0 ); } /* limit depth to prevent errors */ if(_multi<5) { _multi++; return setup.ENCOUNTERS.bill_RANDOM.afterPassage() + setup.ENCOUNTERS.bill_RANDOM.afterPassage(); } else { return ''; } }, }, 'bill_RANDOM':{ 'setup' : function() { var sub_encounter = setup.ALIAS.spinTheWheel(setup.ENCOUNTERS.bill_RANDOM.VARIATIONS); State.setVar( '_sub_encounter', sub_encounter ); return setup.ENCOUNTERS[_sub_encounter].setup(); }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'VARIATIONS' : { 'bill_1' : 30, 'bill_2' : 1, 'bill_5' : 20, 'bill_10' : 15, 'bill_20' : 10, 'bill_50' : 5, 'bill_100' : 2, 'bill_MULTI' : 10, }, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return setup.ENCOUNTERS[_sub_encounter].afterPassage(); }, }, /* END LOOSE BILLS */ /* WALLETS */ 'wallet_MASTER':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : true, 'hideMenu' : false, 'CHOICES' :{ 'whatDoYouDo' : function() { var choices = ''; choices += setup.ALIAS.enc_moreDetail('CHECK FOR CASH', "check_cash", 'wallet_MASTER', {'hotkey':'Q'}); choices += setup.ALIAS.enc_moreDetail('LOOK FOR ID', "check_id", 'wallet_MASTER', {'hotkey':'W'}); choices += setup.ALIAS.enc_showChoices({ 'KEEP IT' : "keep_wallet", 'TAKE THE CASH' : "keep_cash", 'TURN IT IN' : "turn_in", }, 'wallet_MASTER' ); return choices; }, 'check_id' : function() { _checked_id = true; var out = "<p>It appears to belong to a "+ setup.ALIAS.formatHeight(_LICENSE.ht)+", "+ setup.ALIAS.formatWeight(_LICENSE.wt)+", "+ _LICENSE.age +" year old "+ _LICENSE.genpro +" named ""+ _LICENSE.name + "", what do you do with it?</p>"; out += setup.ALIAS.enc_moreDetail('TAKE THE '+_LICENSE.cardtype.toUpperCase(), "take_id", 'wallet_MASTER'); return out; }, 'take_id' : function() { if(_turned_in) { return "<p>It's too late, you've already turned the wallet in!</p>"; } _took_id = true; setup.ALIAS.lightAdd(-20.00, $G.PC); $G.PC.JUNK[_LICENSE.cardtype+'-'+Date.now()] = _LICENSE.name + ''s ' + _LICENSE.cardtype + ' (' + _LICENSE.gender + ' age ' + _LICENSE.age + ", "+setup.ALIAS.formatHeight(_LICENSE.ht)+ ", "+setup.ALIAS.formatWeight(_LICENSE.wt)+ ')'; var out = "<p>You took "+ _LICENSE.name +"'s "+ _LICENSE.cardtype +".</p>"; return out; }, 'check_cash' : function() { _checked_cash = true; var out = "<p>There is $"+ _cash.toFixed(2) +" inside, what do you do?</p>"; return out; }, 'keep_cash' : function() { _took_cash = true; setup.ALIAS.lightAdd(-(20+(_cash*3)+( _checked_cash ? 10 : 0 )), $G.PC); $G.PC.MATRIX.money += _cash; var out = "<p>You take the $"+ _cash.toFixed(2) +" cash and " + either('throw the wallet in the trash.','ditch the wallet.') +"</p>"; setup.ALIAS.showSideBar(); return out + setup.PASSAGES[$G.PC.STATE.lastPassage].exit(); }, 'keep_wallet' : function() { setup.ALIAS.lightAdd(-(50+(_cash*3)), $G.PC); $G.PC.MATRIX.money += _cash; $G.PC.JUNK['wallet-'+Date.now()] = _wallet; if(!_took_id) { setup.ALIAS.lightAdd(-20.00, $G.PC); $G.PC.JUNK[_LICENSE.cardtype+'-'+Date.now()] = _LICENSE.name + ''s ' + _LICENSE.cardtype + ' (' + _LICENSE.gender + ' age ' + _LICENSE.age + ", "+setup.ALIAS.formatHeight(_LICENSE.ht)+ ", "+setup.ALIAS.formatWeight(_LICENSE.wt)+ ')'; } _took_wallet = true; _took_cash = true; _took_id = true; var out = "<p>You keep "+ _LICENSE.name +"'s wallet, it has $"+ _cash.toFixed(2) +" cash and some other junk...</p>"; setup.ALIAS.showSideBar(); return out + setup.PASSAGES[$G.PC.STATE.lastPassage].exit(); }, 'turn_in' : function() { /* add karma */ setup.ALIAS.lightAdd(+(50+(_cash*3)+( _checked_cash ? -20 : 50 )), $G.PC); _turned_in = true; var owner = ( _took_id ? "even moreso that the ID is missing! She" : "immediately tries to page "+ _LICENSE.name +" over the intercomm, after a few minutes pass with no response, she" ); var out = "<p>You turn the wallet in... the clerk is surprised to find $"+ _cash.toFixed(2) +" cash still in it and "+ owner +" asks for your phone number, do you give it?</p>"; return out + setup.ALIAS.enc_showChoices({ 'GIVE HER YOUR NUMBER' : "give_number", 'DON'T TRUST HER' : "dont_give_number", }, 'wallet_MASTER' ); }, 'give_number' : function() { /* add karma */ setup.ALIAS.lightAdd(-10.00, $G.PC); var out = "<p>You tell the clerk your number, you could swear you saw a shy smile as she wrote it down and thanked you.</p>"; setup.ALIAS.showSideBar(); return out + setup.PASSAGES[$G.PC.STATE.lastPassage].exit(); }, 'dont_give_number' : function() { /* add karma */ setup.ALIAS.darkAdd(-10.00, $G.PC); var out = "<p>You decide it might not be the best idea... they might ask questions.</p>"; setup.ALIAS.showSideBar(); return out + setup.PASSAGES[$G.PC.STATE.lastPassage].exit(); }, }, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { var doing = setup.ALIAS.describePassage(); return 'While you were out '+ doing +' you found '+ ' '+ either( 'a', 'a new', 'a worn', 'an old', 'a nice looking', ) +' '+ _wallet +' '+ either( 'under a tire.', 'in a basket.', 'sitting atop the news-bin.', 'on the sidewalk.', 'in a bush.', 'in the weeds.', 'in the grass.', 'in a flower bed.', 'under a tree.', 'under a lamp post.', 'behind the propane return.', 'in front of a vending machine.', 'in somebody's pocket... I wonder if they noticed.', 'under a bench, by the aracade.', 'next to the Blu Box.', 'in the rocks.', 'in the wood chips, beneath the stop sign.', 'behind the pony ride.', 'in a paper sack... along with a bunch of other seemingly stolen items.', 'in your pocket. Wow, where did that come from?', 'in your hand... it was there the whole time.', 'scratching your hip... wait, who put it there?', 'lying under the counter, when you stop in to use the restroom.', 'underfoot.', 'under a bench', 'in a tip jar.', 'in a collection jar.', 'near a school ROTC fundraiser.', 'in a blind musician's guitar case.', 'sitting on the floorboard of an unlocked car... good thing you were there to catch this, there's no telling what someone else might have done.', 'in the trash... egg- why is there a broken egg on this- yuck.' ) +' '+ either( '' ) + '<div>'+ setup.ENCOUNTERS.wallet_MASTER.CHOICES.whatDoYouDo() +'</div>'; }, }, 'wallet_john_smith':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : true, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { /* prep stuff... */ return setup.ENCOUNTERS.wallet_MASTER.afterPassage(); }, }, 'wallet_DYNAMIC':{ 'setup' : function() { var color = either( 'navy', 'navy', 'navy', 'navy', 'navy', 'navy', 'navy', 'navy', 'navy', 'black', 'black', 'black', 'black', 'black', 'black', 'black', 'black', 'gray', 'gray', 'gray', 'gray', 'gray', 'gray', 'gray', 'red', 'red', 'red', 'red', 'red', 'red', 'burgandy', 'burgandy', 'burgandy', 'burgandy', 'burgandy', 'tan', 'tan', 'tan', 'tan', 'tan', 'blue', 'blue', 'blue', 'blue', 'brown', 'brown', 'brown', 'brown', 'hot pink', 'hot pink', 'hot pink', 'purple', 'purple', 'purple', 'dark green', 'dark green', 'pink', 'pink', 'orange', 'yellow', 'lime green', 'rainbow colored', 'sparkly', 'shiny', ); var wallet = either( (color+' cloth'), (color+' cloth'), (color+' cloth'), (color+' cloth'), (color+' cloth'), (color+' cloth'), (color+' cloth'), (color+' cloth'), (color+' cloth'), (color+' cloth'), (color+' cloth'), (color+' cloth'), 'leather', 'leather', 'leather', 'leather', 'leather', 'leather', 'leather', (color+' leather'), (color+' leather'), (color+' leather'), (color+' stamped leather'), (color+' stamped leather'), (color+' velvet'), (color+' velvet'), (color+' velvet'), (color+' velvet'), ('crushed '+color+' velvet'), ('crushed '+color+' velvet'), 'leopard velvet', 'crockodile skin', ) +' wallet'; State.setVar( '_wallet', wallet ); var cash = setup.ALIAS.findCash(0, 500, true, $G.PC); State.setVar( '_cash', cash ); var LICENSE = setup.ALIAS.generateRandomID(); State.setVar( '_LICENSE', LICENSE ); State.setVar( '_checked_cash', false ); State.setVar( '_checked_id', false ); State.setVar( '_turned_in', false ); State.setVar( '_took_cash', false ); State.setVar( '_took_id', false ); State.setVar( '_took_wallet', false ); return setup.ENCOUNTERS.wallet_MASTER.setup(); }, 'replace' : false, 'overrideExit' : true, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { /* prep stuff... */ return setup.ENCOUNTERS.wallet_MASTER.afterPassage(); }, }, 'wallet_RANDOM':{ 'setup' : function() { var sub_encounter = setup.ALIAS.spinTheWheel(setup.ENCOUNTERS.wallet_RANDOM.VARIATIONS); State.setVar( '_sub_encounter', sub_encounter ); return setup.ENCOUNTERS[_sub_encounter].setup(); }, 'replace' : false, 'overrideExit' : true, 'hideMenu' : false, 'VARIATIONS' : { /* 'wallet_john_smith' : 1, */ 'wallet_DYNAMIC' :10, }, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return setup.ENCOUNTERS[_sub_encounter].afterPassage(); }, }, /* END WALLETS */ /* SHOPPING CARTS */ 'cart_MASTER':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'cart_trash':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'cart_money':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'cart_fastfood':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'cart_loose_item':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'cart_1bag':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'cart_3bags':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'cart_bob':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'cart_full':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'cart_purse':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'cart_RANDOM':{ 'setup' : function() { var sub_encounter = setup.ALIAS.spinTheWheel(setup.ENCOUNTERS.cart_RANDOM.VARIATIONS); State.setVar( '_sub_encounter', sub_encounter ); return setup.ENCOUNTERS[_sub_encounter].setup(); }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'VARIATIONS' : { 'cart_trash' :30, 'cart_money' : 3, 'cart_fastfood' :15, 'cart_loose_item' :20, 'cart_1bag' :10, 'cart_3bags' : 6, 'cart_bob' : 4, 'cart_full' : 1, 'cart_purse' : 2, }, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, /* END SHOPPING CARTS */ /* xxxx */ 'car_MASTER':{ 'setup' : function() { setup.TEMP = {}; /* make/model/description... more to the point gross vehicle weight 1800-7800 +0-50% lbs depending on model/type and load, but the average is 3500 empty */ var vh_color = either('black', 'black', 'black', 'black', 'black', 'black', 'black', 'black', 'white', 'white', 'white', 'white', 'white', 'white', 'white', 'white', 'white', 'red', 'red', 'red', 'red', 'red', 'red', 'red', 'red', 'red', 'red', 'red', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'blue', 'yellow', 'yellow', 'yellow', 'yellow', 'yellow', 'orange', 'tan', 'tan', 'beige', 'purple', 'purple', 'aqua-colored', 'powder blue', 'hot pink', 'hot pink', 'gunmetal gray', 'gunmetal gray', 'gunmetal gray', 'silver', 'silver', 'silver', 'silver', 'silver', 'gold', 'gold', 'gold', 'copper-colored', 'neon green', 'mauve', 'indigo', 'lime green', 'lime green', 'black, with flames up the side,', 'azure', 'pink', 'brass-colored', 'unpainted', 'rusted out', 'brown', 'navy', 'navy', 'salmon-colored', 'puke green', 'rainbow-colored', 'six-color', 'black and white', 'blue and white', 'red and white', 'yellow and white', 'green and white', 'purple and white', 'orange and white'); var pre_flavor = either('', '', '', '', '', '', '', '', '', '', '', '', '', '', ' freshly waxed', ' pristine', ' brand new', ' new', ' shiny', ' spotless', ' clean', ' salvaged', ' scraped', ' smashed up', ' banged up', ' wrecked', ' totalled', ' filthy', ' dirty', ' dusty', ' old', ' dinged', ' scratched', ' dented'); var post_flavor = either('', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', ' with "gradauted" written along the back... guess a D in spelling was enough to pass', ' with "just divorced" and a wink written on the back windshield', ' with "just married" sprawled on the side', ' with "just married" written in shoe polish... from the fading of it, looks like they were 'just married' about 2 years ago', ' with a huge dent behind the driver side door', ' with a crushed in left side', ' with a dent in the passenger door', ' with a cracked windshield', ' with a crack in the windshield along the passenger side', ' with a crack running up the middle of the windshield', ' with a shattered windshield', ' with a garfield in the back window', ' with a pair of fuzzy dice hanging off the mirror', ' with spinners', ' with an expired registration', ' with a covered plate', ' with a missing license plate', ' from the looks of it, someone took a golf club to it', ' looks like it's been freshly keyed', ' with a flat tire', ' with a mismatched door on the passenger side', ' with a mismatching hood', ' with a broken window on the driver side', ' leaking some fluid', ' with balding tires', ' with a low tire', ' with paint flaking off the hood', ' with a dented fender', ' missing the right mirror', ' with a driver side mirror barely hanging on', ' with a hugh scratch along the driver side, where it looks like someone keyed a name into it... can't quite make it out though'); var bumper_sticker = either('', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', '', 'Officer, will this sticker saying ''<big>SUPPORT LAW ENFORCEMENT</big>'', stop you from Giving Me a TICKET?', 'RETIRED (Don't Ask Me To Do A Damn Thing)', 'PETA (People Eating Tasty Animals)', 'If God didn't want us to eat animals, He wouldn't have made 'em out of <u>meat</u>', 'Corporations are NOT PEOPLE, Money is NOT SPEECH, and Pizza is NOT A VEGETABLE', 'Darwin Loves You', 'EQUAL RIGHTS FOR ALL SPECIES', 'WHY BE NORMAL?', 'I do whatever my RICE CRISPIES tell me to', 'Did you just fart, or do you always smell that way?', 'Well Behaved Women Rarely Make History', 'SMUGGLING (It's not just a Job, it's an Adventure)', 'AN ARMY OF ONE *', 'What Would Scooby Doo?', 'DON'T READ THIS, WATCH WHAT THE FUCK YOU'RE DOING!', 'If I wanted to Listen to the CRAP coming out of Your Stereo, I'd be Sitting in YOUR Car!', 'Politicians are like Diapers (they need to be changed often- and for the same reason!)', 'MEAN PEOPLE SUCK', 'HATRED IS NOT A FAMILY VALUE', 'Something Wiccan This Way Comes...', 'If you think Education is Expensive, TRY IGNORANCE', 'ANKH IF YOU LOVE ISIS', 'INTOLERANCE WILL NOT BE TOLERATED', 'Don't Meddle in the Affairs of DRAGONS, for you are CRUNCHY, & good with Ketchup.', 'Few Women <i>Admit</i> Their Age, Fewer Men <u>ACT IT</u>.', 'Machinist by Day, PORNSTAR by Night', 'Built for Comfort, NOT FOR SPEED', 'Fuck Authority', 'I'm so Gay I can't even Park Straight', 'I'm Diagonally Parked, in a Parallel Universe', 'You can't be first, but you can be... NEXT!', 'God Bless America', 'Grow you're own dope... (plant a man!)', 'Mall*Wart (you're source for cheap plastic crap)', 'No Coffee, No Workee', 'Jesus loves you (but everyone else thinks you're an asshole!)', 'I'm NOT TEXTING (I'm WATCHING PORN)', 'I'd tell you to GO TO HELL, but I Work There and I don't want to see you EVERYDAY!', 'CONSIDER: Ameteurs Built the ARK, Professionals Built the TITANIC', 'My DOG is smarter than your HONOR STUDENT', 'So Many BAD DRIVERS... So Little AMMUNITION', 'If there was a God, I'd have a BETTER CAR.', 'DODGE THE FATHER, RAM THE DAUGHTER', 'What Would CHUCK NORRIS Do?', 'I OWE, I OWE (It's Off to Work I Go!)', 'SARCASM (Just one of the many services I offer)', 'Some Girls Chase Boys... I just pass them.', 'I Don't Like Political Jokes (I've Seen Too Many of them Get Elected)', 'DON'T STEAL (the GOVERNMENT Hates Competition)', 'My Dog is my Co-Pilot', 'My Baby Daddy was INMATE OF THE MONTH', 'DANGER: to Avoid Death Stand Clear of Vehicle at all times', 'Ignore your rights and they'll go away.', 'This <u>Is</u> a Hybrid: Gasoline + Duct Tape', 'My Kid is an Honor Student & My President is an IDIOT', 'BITCHES BE <big>TRIPPIN'</big> (okay, maybe I PUSHED a few)', 'Don't Hide, Show Your Pride', 'I Drive Faster than my ISP', 'My Kids Think I'M AN ATM', 'I can only please ONE person per day... TODAY IS NOT YOUR DAY! (Tomorrow doesn't look good either)', 'All Men are Animals... some just make Better Pets', 'I'm Out of Estrogen (and I have a gun)', 'QUIT HONKING (I'm on the PHONE damn it)', 'Horses make me happy! You? Not so much.', 'My Parrents Think I'm in College!', 'HONK IF YOU LOVE JESUS. (Keep texting if you want to meet him.)', 'I'm Not Your Wife... SO GET OFF MY ASS!', 'REPUBLICANS/DEMOCRATS... Same Shit, Different Piles!', 'I get along with God just fine (Its his FAN CLUBS that I can't Stand.)', 'MEAN PEOPLE SUCK (nice people swallow)', 'YES! I <big>DO</big> OWN THE ROAD', '<small>This car will explode on impact.</small>', 'DON'T TOUCH ME (I'm not That Kind of Car)', 'LOST YOUR CAT? (try looking under my tires)', 'Don't Drink & Park (Accidents Cause People)', 'I may be slow, but I'm ahead of you!', 'CAUTION! Driver Applying Makup', 'Be nice to America (Or we'll bring democracy to your country.)', 'MOODY BITCH SEEKS NICE GUY FOR LOVE-HATE RELATIONSHIP.', 'GUN CONTROL means using BOTH HANDS', 'My Sexual Preference is: OFTEN', 'To all you VIRGINS... Thanks for NOTHING.', 'I thought I was a SLUT... then I realized I was only acting like a MAN', 'GIVE ME COFFEE... and no one gets Hurt!', 'My Other Ride... is your GIRLFRIEND!', 'PORNST*R', 'HELL was Full... so I Came Back', 'Blame my Parents', 'What part of 'FUCK OFF!' don't you understand?', 'I do whatever the little voices tell me to do...', 'Men would love me for my mind... (if it bounced gently when I walked)', 'Hard work has made me what I am today... FUCKED!', 'You're Looking at More Woman than YOU can Handle.', 'BEWARE: I practice random acts of ROAD RAGE.', 'STRESSED OUT... and nobody to CHOKE!', 'There will always be a place for you... ON MY SHIT LIST!', 'Men are like public toilets... They're either TAKEN, or FULL OF SHIT.', 'We Lied... SIZE MATTERS!', 'Sex Instructor... FIRST LESSON FREE', 'If I wanted a BITCH... I'd buy a dog!', 'I have trouble remembering Names... May I call you, ''ASSHOLE''?', 'NEVER GO TO BED ANGRY... (stay up and plot your REVENGE!)', 'WHEN IN DOUBT... <small>mumble</small>', 'IF ALL ELSE FAILS.... (more duct tape!)', 'NEVER SECOND-GUESS YOURSELF... (well, maybe sometimes)', 'Before giving anyone a piece of your mind, be sure you have enough to spare.', 'If at first you don't Succeed.. REDEFINE SUCCESS.', 'If at First You Don't Succeed... then SKYDIVING is not for you!', 'If at First You Don't Succeed... (DESTROY ALL EVIDENCE YOU TRIED)', 'Never Settle with Words what you could Settle... WITH A FLAMETHROWER!', 'Vegetarians taste better ;p', '...and what difference do YOU make?', 'Torturing one animal is cruelty... (TORTURING MANY IS SCIENCE)', 'I don't eat anything with a face... (I CHOP THAT SHIT OFF FIRST!)', 'My KARMA Ran Over your DOGMA', 'THIS VEHICLE PROTECTED BY ANTI-THEFT STICKER (and a Glock 9mm)', 'HORN BROKEN (Watch for Finger)', 'COVER ME (I'm Changing Lanes)', 'If You're Rich, I'm Single.', 'CONSERVE WATER. SHOWER WITH A FRIEND.', 'Forget about World Peace... visualize using your TURN SIGNAL!', 'I've got a PERFECT BODY... it's in the TRUNK.', 'CAT (the other white meat)', 'Guns Don't Kill People... Drivers with CELLPHONES Do!', 'WHERE THE HELL IS 'Easy Street?'', 'The shortest sentence is ''I Am.'' (the longest is ''I DO'')', 'Gas, Grass, or Ass... No One Rides for Free', 'TAKE REVENGE (shit on a pigeon)', '4 out of 3 people have trouble with Fractions', 'I Child-Proofed My House... BUT THEY <u>STILL</u> GET IN!', 'Wife and Dog Missing (Reward for Dog)', 'Jesus is coming... LOOK BUSY', 'I'm Hung like Einstein, and Smart as a Horse', 'I Am NOT An Alcoholic, I'M A DRUNK... Alcoholics go to Meetings', 'BREAST INSPECTION 20 FEET AHEAD (Please Have 'Em Out)', 'Driver Carries No Cash... HE'S MARRIED.', 'Forget the Cowboy... I want the HORSE!', 'If GUNS cause crime... Why do we want the GOVERNMENT to have them?', 'Sorry Officer, I thought you wanted to RACE.', 'WARNING: My brakes work fine... how's your INSURANCE?', 'I'm having an Out-of-Money Experience', 'Keep Honking... I'm Reloading', 'I still miss my ex... but my AIM is getting better!', 'YOU SHALL NOT PASS!', 'I used up all my sick days... so I called in DEAD.', 'CAUTION: this vehicle makes frequent stops... AT YOUR MOM'S HOUSE!', 'If MONEY is the Root of All Evil, Why do Churches Beg for it?', 'I was an HONOR STUDENT... I don't know what happened.', 'REHAB is only for QUITTERS', 'mc<sup>2</sup>, really? My calculator found all kinds of things that equal E.', 'UCKFA OUYA, OPPERCA', 'If you can read this: YOU'RE TOO FUCKING CLOSE!', 'I Brake For... Oh Shit, NO BRAKES!', 'Break, shit, I step on the gas!', 'I break for TAILGATERS!', 'I break randomly, KEEP YOUR DISTANCE', 'I break for the hell of it!', 'I break for no one', 'I break for Cats', 'Flipped Over Rebuilt Dodge', 'FORD Backwards: Driver Returned On Foot', 'Found on Road Dead', 'Fix Or Repair Daily', 'My job is top secret, even I don't know what I'm doing', 'My kid beat up your honor role student', 'Insert pun here.' ); var vh_type = either('car', 'car', 'car', 'car', 'car', 'car', 'car', 'car', 'minivan', 'minivan', 'van', 'truck', 'truck', 'truck', 'truck', 'SUV', 'SUV'); var vh_class = ''; var vh_cat = ''; var vh_desc = ''; var curb_wt = 0; var load_sz = 0; var max_wt = 0; switch(vh_type) { case 'car': vh_class = either('tiny', 'compact', 'mid-size', 'large' ); load_sz=0.25; break; case 'minivan': vh_class = either( 'small', 'mid-size', 'large', 'XL' ); load_sz=0.35; break; case 'van': vh_class = either( 'small', 'mid-size', 'large', 'XL' ); load_sz=0.50; break; case 'truck': vh_class = either( 'compact', 'mid-size', 'large', 'XL', 'XXL' ); load_sz=0.50; break; case 'SUV': vh_class = either( 'compact', 'mid-size', 'large', 'XL', 'XXL' ); load_sz=0.50; break; default: /* no motorhome, semi, limo, etc. at this time... */ break; } vh_cat = vh_class +' '+ vh_type; switch(vh_cat) { case 'tiny car': curb_wt=1800; break; case 'compact car': curb_wt=3000; break; case 'mid-size car': curb_wt=3500; break; case 'large car': curb_wt=4400; break; case 'small minivan': curb_wt=3000; break; case 'mid-size minivan': curb_wt=3500; break; case 'large minivan': curb_wt=4400; break; case 'XL minivan': curb_wt=5400; break; case 'small van': curb_wt=3500; break; case 'mid-size van': curb_wt=4300; break; case 'large van': curb_wt=5400; break; case 'XL van': curb_wt=6500; break; case 'compact truck': curb_wt=3500; break; case 'mid-size truck': curb_wt=4300; break; case 'large truck': curb_wt=5400; break; case 'XL truck': curb_wt=6500; break; case 'XXL truck': curb_wt=7600; break; case 'compact SUV': curb_wt=3500; break; case 'mid-size SUV': curb_wt=4300; break; case 'large SUV': curb_wt=5400; break; case 'XL SUV': curb_wt=6500; break; case 'XXL SUV': curb_wt=8000; break; case 'stretched x': /* very rare/custom work */ break; default: break; } max_wt = curb_wt * (1+load_sz); var vehicle_weight = setup.ALIAS.rand(curb_wt, max_wt, true); /* todo: add if-bumpersticker branch... */ vh_desc = vh_class + pre_flavor +' '+ vh_color +' '+ vh_type + post_flavor; if(bumper_sticker.length>0) { vh_desc += ", with a bumper sticker that reads, ""+ bumper_sticker +"""; State.setVar( '_bumper_sticker', bumper_sticker ); } var owner_present = Math.random()<0.16; var min2owner = (owner_present ? 0 : Math.round(setup.ALIAS.rand(5, 90)) ); State.setVar( '_vehicle_color', vh_color ); State.setVar( '_vehicle_type', vh_type ); State.setVar( '_vehicle_category', vh_cat ); State.setVar( '_vehicle_weight', vehicle_weight); State.setVar( '_vehicle_desc', vh_desc ); State.setVar( '_vehicle_class', vh_class ); State.setVar( '_min2owner', min2owner ); State.setVar( '_owner_present', owner_present ); State.setVar( '_vehicle_gone', false ); /* setup.TEMP.vh_color = vh_color; */ /* setup.TEMP.vh_cat = vh_cat; */ /* setup.TEMP.vehicle_weight = vehicle_weight; */ /* setup.TEMP.vh_desc = vh_desc; */ /* GENERATE OWNER */ setup.ENCOUNTERS.random_opponent.setup(); return 'car_MASTER:setup()'; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'CHOICES' :{ 'options' : function() { var choices = ''; if(_bumper_sticker) { choices += setup.ALIAS.enc_moreDetail('COLLECT THE BUMPER (sticker)', "collect_bumper", 'car_MASTER', {'hotkey':'Q'}); } if(!_owner_present) { choices += setup.ALIAS.enc_moreDetail('WAIT FOR THE OWNER', "owner_wait", 'car_MASTER', {'hotkey':'W'}); } return choices; }, 'whatDoYouDo' : function() { var choices = ''; var ACTIONS = {}; if(!_vehicle_gone) { ACTIONS['SOMETHING TO THE '+ _vehicle_type.toUpperCase() +'...'] = "whatDoYouDo_toTheCar"; } /* wait for the owner */ if(_owner_present) { ACTIONS['SOMETHING TO '+ _P2.name_first.toUpperCase() +'...'] = "whatDoYouDo_toTheOwner"; } ACTIONS['NOTHING...'] = "leave_it"; choices += setup.ALIAS.enc_showChoices(ACTIONS, 'car_MASTER', { 'choices_id' : 'car_choices', } ); return choices; }, 'whatDoYouDo_toTheCar' : function() { var choices = ''; choices += setup.ALIAS.enc_showChoices({ 'LIFT IT' : "lift_it", 'DESTROY IT' : "destroy_it", }, 'car_MASTER', { 'cancel' : 'whatDoYouDo', 'choices_id' : 'car_choices', } ); return choices; }, 'whatDoYouDo_toTheOwner' : function() { var choices = ''; var hht_uc = setup.ALIAS.him_her(_P2.TRAITS.gender).toUpperCase(); var warn = '<small><small><i>(WARNING: this will take you out of the car encounter!)</i></small></small>'; choices += setup.ALIAS.enc_showChoices({ ['FIGHT '+hht_uc+' '+warn] : "owner_fight", ['FLIRT WITH '+hht_uc] : "owner_flirt", ['CLAIM '+hht_uc] : "owner_claim", }, 'car_MASTER', { 'cancel' : 'whatDoYouDo', 'choices_id' : 'car_choices', } ); return choices; }, 'collect_bumper' : function() { /* approx force to rip 1 side out, use the row exercise to calculate this lift */ var out = ''; var weight = _vehicle_weight*0.42; var reps = setup.ALIAS.calcReps('Bent-over Row', weight, $G.PC); var owner_reaction = ''; if(!_vehicle_gone) { /* get credit for the workout */ setup.ALIAS.doLift($G.PC, {'workout':'Bent-over Row', 'weight':weight, 'bonus':'STR', 'reps':1, }); switch(true) { case (reps< 0.12): out+='You put everything you've got into pulling... aside from hurting yourself, nothing happened. The _vehicle_type won this round.'; owner_reaction = " "What are you trying to do to my _vehicle_type, bitch?!", the owner exclaims, inches away from your face."; break; case (reps< 0.35): out+='Pulling as hard as you can, you hear a little groan in the mettle, but it doesn't budge...'; owner_reaction = ""What the fuck, man? Why you tryin to fuck up my ride??", "+setup.ALIAS.he_she(_P2.TRAITS.gender)+' confronts.'; break; case (reps< 1.00): out+='You manage to bend the bumper a little before your arm gives out...'; owner_reaction = " "What the fuck are you doing?!", _P2.name_first booms."; break; case (reps>=1000.00): out+='You pulled so hard you tore the entire back end off the '+_vehicle_type+'... yeah, that axel's trashed. Oh well, at least your sticker's intact.'; owner_reaction = " The owner is floored, "Oh my god, what the hell did you do to my " +"<big class='crescendo' style='--p: 69px; --y: -15deg; --z: -3deg; --w: 0.8;'>_vehicle_type</big>, <b>you " +"<big><big class='crescendo' style='--p: 69px; --y: -15deg; --z: -3deg; --w: 0.72;'>FREAK</big></big>?</b> " +"<span class='crescendo' style='--p: 134px; --y: -10deg; --z: -2deg; --w: 0.7'>How the fuck are you so " +"<big class='crescendo' style='--p: 72px; --y: -30deg; --z: 3deg; --w: 0.69'><b>strong</b></big>??</span> " +"<small class='decrescendo' style='--p: 84px; --y: 5deg; --z: 2deg; --w: 1.45;'>Now how am I supposed to get to work?</small>", " +setup.ALIAS.he_she(_P2.TRAITS.gender)+" says, "+setup.ALIAS.his_her(_P2.TRAITS.gender)+" voice trailing off."; $G.PC.JUNK[_vehicle_type+' back-end and bumper-'+Date.now()] = (_vehicle_type+' back-end- with a bumper sticker that reads, "'+_bumper_sticker+'"'); break; case (reps>= 50.0): out+='You tear the bumper off with ease... a little too much ease, it takes you almost a minute to straighten out all the bends and twists in the metal...'; owner_reaction = ""-the fuck?", the owner says, backing away, "stay back you crazy bitch, I'm'a call the cops!""; $G.PC.JUNK['warped bumper-'+Date.now()] = ('warped bumper- with a sticker that reads, "'+_bumper_sticker+'"'); break; case (reps>= 5.0): out+='You rip the bumper off and add it to your sticker collection... you applied the perfect amount of force to the right points, the bumper is in pristine condition!'; owner_reaction = ""-the hell's wrong with you? You can't just go around destroyin' other people's shit!""; $G.PC.JUNK['intact bumper-'+Date.now()] = ('intact bumper- with a sticker that reads, "'+_bumper_sticker+'"'); break; case (reps>= 1.0): out+='Straining mightily, you manage to rip the bumper off for your collection... a bit bent up with all the yanking and twisting it took to get off... oh well, at least you can still read it. If you were a bit stronger, perhaps you could straighten it.'; owner_reaction = " _P2.name is fuming, "You ripped off my fucking bumper!""; $G.PC.JUNK['twisted bumper-'+Date.now()] = ('twisted bumper- with a sticker that reads, "'+_bumper_sticker+'"'); break; } } else { out+='too late now... it's gone.'; } return out +(_owner_present ? "<p class='npc_reaction "+_P2.TRAITS.gender+"'>"+owner_reaction+'</p>' : ''); }, 'owner_wait' : function() { var out = ''; var owner_reaction = ''; if(!_vehicle_gone) { out = "<<set _owner_present=true;>>" + '_min2owner minutes later you see '+ setup.ENCOUNTERS.car_MASTER.CHOICES.owner_desc()+" heading toward the _vehicle_type. What do you do?"+"<<replace '#car_choices'>><<print setup.ENCOUNTERS.car_MASTER.CHOICES.whatDoYouDo(); >><</replace>>"; } else { owner_reaction = "<p class='npc_reaction "+_P2.TRAITS.gender+"'>"+ ""Huh? Where the <big class='crescendo' style='--p: 69px; --y: -15deg; --z: -3deg; --w: 0.81;'><b>FUCK</b></big> is my <big class='crescendo' style='--p: 69px; --y: -15deg; --z: -3deg; --w: 0.8;'><b><<print _vehicle_type.toUpperCase();>>?!</b></big> "" +'</p>'; out = "<<set _owner_present=true;>>" + '_min2owner minutes later '+ setup.ENCOUNTERS.car_MASTER.CHOICES.owner_desc()+" comes out looking for <<print setup.ALIAS.his_her(_P2.TRAITS.gender);>> _vehicle_type... "+ owner_reaction +" What do you do?"+"<<replace '#car_choices'>><<print setup.ENCOUNTERS.car_MASTER.CHOICES.whatDoYouDo(); >><</replace>>"; } return out; }, 'owner_desc' : function() { var out = ''; var descAge2 = setup.ALIAS.descAge(_P2.METRICS.age); out = setup.ALIAS.a_an(descAge2) +' '+ _P2.genpro + ' by the name of '+ _P2.name +" (roughly " + setup.ALIAS.estAge(_P2.METRICS.age) + ", about "+ _P2.ht +" tall, and looks to weigh about "+ _P2.wt +"; You can't be sure, but it looks like "+(_P2.TRAITS.gender=='male'?'his':'her')+" arms are about " + _P2.bicep +" around)"; return out; }, 'owner_flirt' : function() { var out = 'owner_flirt : option not programmed yet...'; return out + setup.ENCOUNTERS.car_MASTER.CHOICES.whatDoYouDo_toTheOwner(); }, 'owner_claim' : function() { var out = 'owner_claim : option not programmed yet...'; return out + setup.ENCOUNTERS.car_MASTER.CHOICES.whatDoYouDo_toTheOwner(); }, 'lift_it' : function() { /* approx force to SAFELY lift vehicle overhead and maintain control of it, use military press exercise to calculate this lift with a safe margin, also for pressing reps */ /* seconds_held = reps*10; */ var out = ''; var weight = _vehicle_weight*1.34; var TEST = setup.ALIAS.canDoLift('Military Press', $G.PC); if(!TEST.canDo) { return 'You have too much '+ TEST.reason +' to lift this vehicle, give yourself time to heal before trying this again...' + setup.ENCOUNTERS.car_MASTER.CHOICES.whatDoYouDo(); } var reps = setup.ALIAS.calcReps('Military Press', weight, $G.PC); /* get credit for the workout */ setup.ALIAS.doLift($G.PC, {'workout':'Military Press', 'weight':weight, 'bonus':'STR', 'reps':1, }); if(!_vehicle_gone) { /* remember this for other options... */ setup.TEMP.lift_car_reps = reps; switch(true) { case (reps< 0.001): out+='You are too tired to even try lifting this...' + setup.ENCOUNTERS.car_MASTER.CHOICES.whatDoYouDo(); break; case (reps< 0.080): out+='You don't even get the tires off the ground... what were you thinking, trying to lift this?' + setup.ENCOUNTERS.car_MASTER.CHOICES.whatDoYouDo(); break; case (reps< 0.250): out+='You got the back tires up before your muscles gave out...' + setup.ENCOUNTERS.car_MASTER.CHOICES.whatDoYouDo(); break; case (reps< 0.500): out+='You had the whole back end up... but you couldn't get the front before you had to drop it...' + setup.ENCOUNTERS.car_MASTER.CHOICES.whatDoYouDo(); break; case (reps< 1.000): out+='You almost had it! Too bad you lost control and had to ditch it... the '+ _vehicle_type +' landed on its roof, blowing out all the windows. It also set off several nearby car alarms, perhaps this would be a good time to leave.' + setup.ENCOUNTERS.car_MASTER.CHOICES.whatDoYouDo(); break; case (reps>=1000.000): out+='The '+ _vehicle_type +' is so light it's almost boring... perhaps you could find something fun to do with it?'+ setup.ENCOUNTERS.car_MASTER.CHOICES.lifted_nowWhat(); break; case (reps>= 50.000): out+='Grabbing the back, you hoist the '+ _vehicle_type +' high above your head. This wasn't nearly as hard as you were expecting, you could probably hold this for several minutes; what do you want to do with it?'+ setup.ENCOUNTERS.car_MASTER.CHOICES.lifted_nowWhat(); break; case (reps>= 5.000): out+='Reaching deep down, you summon enough strength to lift the car overhead... wow, this thing is filthy. You figure you've got about thirty seconds before you have to drop it, what do you do?'+ setup.ENCOUNTERS.car_MASTER.CHOICES.lifted_nowWhat(); break; case (reps>= 1.000): out+='You got it up! Can't- Hold- It- Long. What do you do?'+ setup.ENCOUNTERS.car_MASTER.CHOICES.lifted_nowWhat(); break; } } else { out = 'there's nothing to lift!'; } return out; }, 'lifted_nowWhat' : function() { var choices = ''; var reps = setup.TEMP.lift_car_reps; var ACTIONS = {}; /* combine these better, and make more variation in each based on STR */ /* PUT IT DOWN */ if(reps< 3) { ACTIONS['DROP IT' ] = "drop_it"; } if(reps>= 3) { ACTIONS['PUT IT BACK DOWN' ] = "put_it_back_down"; } if(reps>= 6) { ACTIONS['SLAM IT DOWN!' ] = "slam_it_down"; } /* PLAY */ if(false && reps>= 300) { ACTIONS['PLAY CATCH! (repeatable)' ] = "play_catch"; } if(false && reps>= 100000) { ACTIONS['RIP IT IN HALF' ] = "rip_it_in_half"; } /* at low end: must bend and fatigue first: at high end: can pull apart like taffy... */ /* KEEP HOLDING/CARRY IT SOMEWHERE */ if(false && reps>= 1000) { ACTIONS['TAKE IT HOME' ] = "take_it_home"; } /* WORKOUT */ if(false && reps>= 10) { ACTIONS['DO SQUATS (repeatable)' ] = "do_squats"; } if(false && reps>= 30) { ACTIONS['PUMP IT OVERHEAD (repeatable)' ] = "pump_it_overhead"; } /* bicep-curl? */ /* HURL */ ACTIONS['THROW IT!' ] = "throw_it"; /* Probability order: Nothing/extra-stellar, Ort, Sun, Asteroid, Kuiper, Moon, Mars, Venus, Jupiter, Saturn, everything else... Uranus, Neptune, Ceres, Pluto, Kerberos, alien ship in orbit ;p */ /* ADD ALT VER OF [GROUND-] SMASH OPTIONS */ /* CRUSH */ if(false && reps>= 10000) { ACTIONS['FOLD IT IN HALF (repeatable)' ] = "fold_it_in_half"; } if(false && reps>= 100000000) { ACTIONS['CRUSH IT INTO A BALL' ] = "crush_it_into_a_ball"; } if(false && reps>=1000000000) { ACTIONS['CRUSH IT INTO NOTHING' ] = "crush_it_into_nothing"; } /* MAKE KEGEL WEIGHT? */ choices += setup.ALIAS.enc_showChoices( ACTIONS, 'car_MASTER', { 'cancel' : 'whatDoYouDo', 'choices_id' : 'car_choices', } ); return choices; }, /* LIFTED CHOICES */ /* PUT IT DOWN */ 'drop_it' : function() { var out = 'You drop the _vehicle_type on its roof, damaging it and blowing out the windows.'; return out + setup.ENCOUNTERS.car_MASTER.CHOICES.whatDoYouDo(); }, 'put_it_back_down' : function() { var out = 'You carefully set the _vehicle_type back down.'; return out + setup.ENCOUNTERS.car_MASTER.CHOICES.whatDoYouDo(); }, 'slam_it_down' : function() { var out = 'slam_it_down : option not programmed yet...' + (settings.debugModeInfo ? " (but since you have debug messages on, let me ask where do you want to slam it, on the ground or on the owner? Send me a note or comment over on <a target='_blank' href='https://shadowrx.deviantart.com'>deviantArt</a> or <a target='_blank' href='https://www.patreon.com/ShadowRx'>Patreon</a> and let me know what kind of slamming options you're looking for.)" : ''); return out + setup.ENCOUNTERS.car_MASTER.CHOICES.whatDoYouDo(); }, /* PLAY */ 'play_catch' : function() { var out = 'play_catch : option not programmed yet...'; return out + setup.ENCOUNTERS.car_MASTER.CHOICES.lifted_nowWhat(); }, 'rip_it_in_half' : function() { var out = 'rip_it_in_half : option not programmed yet...'; return out + setup.ENCOUNTERS.car_MASTER.CHOICES.lifted_nowWhat(); }, /* KEEP HOLDING/CARRY IT SOMEWHERE */ 'take_it_home' : function() { var out = 'take_it_home : option not programmed yet...'; return out + setup.ENCOUNTERS.car_MASTER.CHOICES.lifted_nowWhat(); }, /* WORKOUT */ 'do_squats' : function() { var out = 'do_squats : option not programmed yet...'; return out + setup.ENCOUNTERS.car_MASTER.CHOICES.lifted_nowWhat(); }, 'pump_it_overhead' : function() { var out = 'pump_it_overhead : option not programmed yet...'; return out + setup.ENCOUNTERS.car_MASTER.CHOICES.lifted_nowWhat(); }, /* HURL */ 'throw_it' : function() { var sX=setup.ALIAS; var CHAR = $G.PC; var out = ''; var weight = _vehicle_weight*1.34; var reps = sX.calcReps('Military Press', weight, $G.PC); /* get credit for the workout */ sX.doLift($G.PC, {'workout':'Military Press', 'weight':weight, 'bonus':'STR', 'reps':'*', }); var half_ft = (CHAR.METRICS.ht) /12 / 2; var drop_dmg = half_ft * weight; var throw_dist = half_ft * reps; var throw_dmg = half_ft * weight * reps; /* AU Miles feet */ switch(true) { /* SLIPPED */ case (reps< 1): out = ' You lost power as you went to throw it; the _vehicle_category crashed back down upon you, doing '+ drop_dmg +' damage (falling a mere '+ sX.formatLength(throw_dist*12) +' in front of you)'; CHAR.MATRIX.tough -= drop_dmg/10; sX.qiAdd(-drop_dmg, CHAR); break; /* NOT FAR ENOUGH... */ case (throw_dist< 3): out = ' You threw the vehicle, but it didn't go quite far enough, the tail end fell back on you doing '+ drop_dmg/2 +' (damage having only gone '+ sX.formatLength(throw_dist*12) +')'; CHAR.MATRIX.tough -= drop_dmg/10 /2; sX.qiAdd(-drop_dmg/2, CHAR); break; /* Oort ends at 200k AU / 3.2 lightyears */ case (throw_dist>=(300000 *92955807 *5280)): out += ' Spinning in a tight circle to build momentum, you sling the _vehicle_category into the heavens in a blazing flash of light. You're not sure it survived escape, but whatever's left is headed for deep space, far beyond our solar system. (At least '+ sX.formatLength(throw_dist*12) +' away.) Your inner nerd can't help but muse that this might be an <b>Enterprise</b> rental car you sent into the <b>final frontier</b>... and wonder exactly what it will make <b>first contact</b> with... well, it's sure to make quite an impression wherever it winds up!'; _vehicle_gone=true; break; /* Oort starts at 50k AU / 0.8 lightyears */ case (throw_dist>=( 30000 *92955807 *5280)): out += ' You launch the _vehicle_class _vehicle_color _vehicle_type from a running leap deep into the Oort Cloud on the edge of our system, a trail of fire lighting a path through our atmosphere. (You flung it no less than '+ sX.formatLength(throw_dist*12) +' ). Driving yourself into the ground in the process. It only takes a couple of seconds for you to extracate your mighty form from the soft pavement.'; _vehicle_gone=true; break; /* SUN-SHOT 933k miles to L1 @ 1/100 solar */ case (throw_dist>=( 1 * 932057 *5280)): out += ' You chuck the _vehicle_type past Sol-Terra Lagrange One and on a short journey to be incinerated as it enters into the Sun's Corona (having thrown it '+ sX.formatLength(throw_dist*12) +' before the Sun's gravity took over).'; _vehicle_gone=true; break; /* MOON-SHOT 203k miles to L1 @ 5/6 lunar */ case (throw_dist>=( 202601 *5280)): out += ' You lob the _vehicle_category into space and shatter its remanents across the surface of the Moon (if not for the sudden stop, it would have gone at least '+ sX.formatLength(throw_dist*12) +', well past the Earth-Moon L1 Point).'; _vehicle_gone=true; break; /* HIGH ORBIT 70k miles ~30k+ mi up */ case (throw_dist>=( 70000 *5280)): out += ' You fling the _vehicle_type into High Earth Orbit, nearly clipping a telecom satellite on the way (to its sharp elliptical orbit, coming out to nearly the full '+ sX.formatLength(throw_dist*12) +' you tossed it).'; _vehicle_gone=true; break; /* LOW ORBIT 20k miles ~600 mi up */ case (throw_dist>=( 20000 *5280)): out += ' You hurl the _vehicle_type into a low orbit around the Earth, breaking the record for the cheapest vehicle sent into space! (the '+ sX.formatLength(throw_dist*12) +' at the angle you flung it put it into a perfectly stable orbit, it won't be coming back any time soon.)'; _vehicle_gone=true; break; /* ACROSS THE GLOBE 7k-19k miles */ case (throw_dist>=( 7000 *5280)): out += ' You bury the _vehicle_category in a newly formed crater on the other side of the world. Damn it, you curse, realizing too late that you should have wrote a message on it asking them to throw it back... (I mean it was only a '+ sX.formatLength(throw_dist*12) +' toss, surely it couldn't be too hard to return.)'; _vehicle_gone=true; break; /* ACROSS THE CONTINENT 2k-6.9k miles */ case (throw_dist>=( 2000 *5280)): out += ' You deposit the _vehicle_type deep in a mountainside on the far end of the continent! ('+ sX.formatLength(throw_dist*12) +' away.) Well, there's iron in those hills now.'; _vehicle_gone=true; break; /* OUT OF THE STATE 700-1999 miles */ case (throw_dist>=( 700 *5280)): out += ' You flick the _vehicle_type to an empty field several states away (after a journey of '+ sX.formatLength(throw_dist*12) +' ).'; _vehicle_gone=true; break; /* ACROSS THE STATE 200-699 miles */ case (throw_dist>=( 200 *5280)): out += ' You land the _vehicle_type across the state (some '+ sX.formatLength(throw_dist*12) +' away). This is getting pretty easy.'; _vehicle_gone=true; break; /* OUT OF THE COUNTY 70-199 miles */ case (throw_dist>=( 70 *5280)): out += ' You launch the _vehicle_color _vehicle_type in a wide arc, landing several counties away (after making a '+ sX.formatLength(throw_dist*12) +' trip).'; _vehicle_gone=true; break; /* ACROSS THE COUNTY 20-69 miles */ case (throw_dist>=( 20 *5280)): out += ' Taking a running start, you catapult the _vehicle_type halfway across the county ('+ sX.formatLength(throw_dist*12) +' away).'; _vehicle_gone=true; break; /* ACROSS TOWN 7-19 miles */ case (throw_dist>=( 7 *5280)): out += ' Stretching backward for momentum, you flip the _vehicle_type out of town and into a neighboring city ('+ sX.formatLength(throw_dist*12) +' distant).'; _vehicle_gone=true; break; /* ACROSS TOWN 2-6.9 miles */ case (throw_dist>=( 2 *5280)): out += ' You sling the _vehicle_type clear across town (coming down '+ sX.formatLength(throw_dist*12) +' away).'; _vehicle_gone=true; break; /* DOWN THE STREET 3000-9999ft */ case (throw_dist>= 3000): out += ' You lob the _vehicle_class _vehicle_color _vehicle_type at down the street and several blocks over, luckily, you didn't strike a building, there's no telling how much damage that might have done. (the vehicle landed in the middle of the street, about '+ sX.formatLength(throw_dist*12) +' away.)'; _vehicle_gone=true; break; /* OUT OF THE LOT 1000-2999ft */ case (throw_dist>= 1000): out += ' You fling the awkward mass of the _vehicle_type clean out of the lot (some '+ sX.formatLength(throw_dist*12) +' away), you can kind of see where it landed, but it will be hard to recover and it's already starting to come apart.'; _vehicle_gone=true; break; /* ACROSS THE LOT 300-999ft */ case (throw_dist>= 300): out += ' You chuck the steel _vehicle_type across the lot ('+ sX.formatLength(throw_dist*12) +' away), it's a bit of a walk, but it's still in range if you wanted to try again.'; break; /* OUT OF THE ROW 100-299ft */ case (throw_dist>= 100): out += ' You toss the bulky _vehicle_type out of the row (a good '+ sX.formatLength(throw_dist*12) +' ).'; break; /* DOWN THE ROW 30-99ft */ case (throw_dist>= 30): out += ' You hurl the heavy _vehicle_type down the row (sending it '+ sX.formatLength(throw_dist*12) +' away).'; break; /* A COUPLE SPOTS AWAY 10-29ft */ case (throw_dist>= 10): out += ' You heave the massive _vehicle_color _vehicle_type a couple of parking spots away (about '+ sX.formatLength(throw_dist*12) +').'; break; /* A SHORT DISTANCE 3-9.9ft */ default: out += ' You pitch the _vehicle_type a short distance away (roughly '+ sX.formatLength(throw_dist*12) +' ).'; break; } /* DEBUG OVERRIDE */ return out + setup.ENCOUNTERS.car_MASTER.CHOICES.whatDoYouDo(); }, /* Probability order: Nothing/extra-stellar, Ort, Sun, Asteroid, Kuiper, Moon, Mars, Venus, Jupiter, Saturn, everything else... Uranus, Neptune, Ceres, Pluto, Kerberos, alien ship in orbit ;p */ /* ADD ALT VER OF [GROUND-] SMASH OPTIONS */ /* CRUSH */ 'fold_it_in_half' : function() { var out = 'fold_it_in_half : option not programmed yet...'; return out + setup.ENCOUNTERS.car_MASTER.CHOICES.lifted_nowWhat(); }, 'crush_it_into_a_ball' : function() { var out = 'crush_it_into_a_ball : option not programmed yet...'; return out + setup.ENCOUNTERS.car_MASTER.CHOICES.lifted_nowWhat(); }, 'crush_it_into_nothing' : function() { var out = 'crush_it_into_nothing : option not programmed yet... (but vehicle destroyed none the less...)'; _vehicle_gone=true; return out + setup.ENCOUNTERS.car_MASTER.CHOICES[( _vehicle_gone ? 'whatDoYouDo' : 'lifted_nowWhat' )](); }, /* MAKE KEGEL WEIGHT? */ /* END LIFTED CHOICES */ 'destroy_it' : function() { /* smash, punch, kick, bear-hug, scissor, sit, jump, suplex, ??? */ var out = $G.PC.NAMES.first.toUpperCase() + ' SMASH!' + '(destroy_it : option not programmed yet...)'; return out + setup.ENCOUNTERS.car_MASTER.CHOICES.whatDoYouDo_toTheCar(); }, 'program_me' : function() { var out = 'option not programmed yet...'; return out + setup.PASSAGES[$G.PC.STATE.lastPassage].exit(); }, 'leave_it' : function() { var out = 'You decide to leave that problem for someone else...'; return out + setup.PASSAGES[$G.PC.STATE.lastPassage].exit(); }, 'owner_fight' : function() { setup.ALIAS.hideSideBar(); setup.ENCOUNTERS.combat.setup(); return "<<replace '#passages'>><<include 'COMBAT UI'>><</replace>>"; }, }, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'car_alarm':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'car_body':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'car_broken_window':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'car_child':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'car_customer_weak':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'car_dead':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'car_domestic':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'car_doubleparked':{ 'setup' : function() { setup.ENCOUNTERS.car_MASTER.setup(); return 'car_doubleparked:setup()'; }, 'replace' : false, 'overrideExit' : true, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { var out = ''; if(!_vehicle_desc) { /* out += 'YOU FUCKING LIAR!'; */ /* State.setVar( '_vehicle_desc', setup.TEMP.vh_desc ); */ /* State.setVar( '_vehicle_weight', setup.TEMP.vehicle_weight ); */ /* State.setVar( '_vehicle_category', setup.TEMP.vh_cat ); */ /* State.setVar( '_vehicle_color', setup.TEMP.vh_color ); */ /* THIS TIME DONT FUCKING FORGET THE TEMPORARY VARIABLES ASSHOLE! */ setup.ENCOUNTERS.car_MASTER.setup(); } out += 'Some jackass took up '+ either('2', '2', '2', '2', '4', '4', '3', '6') +' parking spaces... it's a ' + "_vehicle_desc" + '. Your best guess is that it weighs about ' + "<<print setup.ALIAS.formatWeight(_vehicle_weight || 0); >>" + (_owner_present ? '<p>'+ either( 'Standing nearby is ', 'Someone, you presume is the owner, is walking away; '+ setup.ALIAS.he_she(_P2.TRAITS.gender) +' is ', 'You see someone walking toward the _vehicle_type, ' )+setup.ENCOUNTERS.car_MASTER.CHOICES.owner_desc() +'</p>' : '' ) +'<div>'+ setup.ENCOUNTERS.car_MASTER.CHOICES.options()+ setup.ENCOUNTERS.car_MASTER.CHOICES.whatDoYouDo() +'</div>'; return out; }, }, 'car_fire':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'car_firelane':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'car_flat':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'car_hit':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'car_leaking':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'car_lights':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'car_not_handicap':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'car_pet':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'car_running':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'car_runover':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'car_sex':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'car_sleeping':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'car_theft':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'car_RANDOM':{ 'setup' : function() { var sub_encounter = setup.ALIAS.spinTheWheel(setup.ENCOUNTERS.car_RANDOM.VARIATIONS); State.setVar( '_sub_encounter', sub_encounter ); return setup.ENCOUNTERS[_sub_encounter].setup(); }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'VARIATIONS' : { 'car_alarm' :10, 'car_body' :10, 'car_broken_window' :10, 'car_child' :10, 'car_customer_weak' :30, 'car_dead' :10, 'car_domestic' :10, 'car_doubleparked' :300, 'car_fire' :10, 'car_firelane' :50, 'car_flat' :10, 'car_hit' :10, 'car_leaking' :10, 'car_lights' :10, 'car_not_handicap' :50, 'car_pet' :10, 'car_running' :10, 'car_runover' :10, 'car_sex' :10, 'car_sleeping' :10, 'car_theft' :10, }, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, /* END xxxx */ /* COMBAT MASTER */ 'combat':{ 'setup' : function() { var CHAR = $G.PC; /* setup.ALIAS.statGet(stat, secAlias, CHAR); */ var S = setup.ALIAS.statGet('all', 'current', CHAR); var P1={}; P1={ 'name' : $G.PC.name, 'name_first': $G.PC.name_first, 'age' : setup.ALIAS.val('age' , CHAR), 'gender' : setup.ALIAS.val('gender' , CHAR), 'ht' : setup.ALIAS.val('ht' , CHAR), 'wt' : setup.ALIAS.val('wt' , CHAR), 'str' : setup.ALIAS.statPrint('STR', CHAR), 'end' : setup.ALIAS.statPrint('END', CHAR), 'spd' : setup.ALIAS.statPrint('SPD', CHAR), 'phy' : setup.ALIAS.statPrint('PHY', CHAR), 'ins' : setup.ALIAS.statPrint('INS', CHAR), 'wsd' : setup.ALIAS.statPrint('WSD', CHAR), 'level' : (S.level).toFixed(0), 'caliber' : (S.caliber).toFixed(0), 'actor' : 'player', 'BODY' : CHAR.BODY, 'LIMBS' : CHAR.LIMBS, 'S' : S, 'MATRIX' : CHAR.MATRIX, 'METRICS' : CHAR.METRICS, 'TRAITS' : CHAR.TRAITS, 'STATUS' : CHAR.STATUS, 'R' : CHAR.R, 'Y' : CHAR.Y, 'M' : CHAR.M, }; Object.keys(CHAR).forEach(function(sec) { P1[sec] = CHAR[sec]; }); P1.tone = setup.ALIAS.char_metric('bodytone', P1); P1.fat = setup.ALIAS.char_metric('bodyfat', P1); P1.bicep = setup.ALIAS.char_metric('bicep', P1); P1.quads = setup.ALIAS.char_metric('quads', P1); P1.figure = setup.ALIAS.char_metric('figure', P1); setup.ALIAS.regenerateBody(0.01, 0.01, P1); State.setVar( '_P1', P1 ); State.setVar( '_round', 0 ); return ''; }, 'replace' : true, 'overrideExit' : true, 'hideMenu' : true, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return "<<include 'COMBAT UI'>>"; }, 'afterPassage' : function() { return ''; }, }, /* END COMBAT */ /* RANDOM OPPONENT */ 'random_opponent':{ 'setup' : function() { var sX=setup.ALIAS; setup.ENCOUNTERS.wallet_DYNAMIC.setup(); var P2=sX.generateCharFromLicense(_LICENSE); P2.actor='cpu-npc'; sX.combat_loadP2(P2); setup.ENCOUNTERS.combat.setup(); return ''; }, 'replace' : true, 'overrideExit' : true, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return setup.ENCOUNTERS['combat'].replacePassage(); }, 'afterPassage' : function() { return setup.ENCOUNTERS['combat'].afterPassage(); }, }, /* END RANDOM OPPONENT */ /* xxxx */ 'stalker':{ 'setup' : function() { setup.ENCOUNTERS.random_opponent.setup(); /* do we want to edit _P2 for this encounter? */ return ''; }, 'replace' : true, 'overrideExit' : true, 'hideMenu' : true, 'CHOICES' :{ 'whatDoYouDo' : function() { var choices = ''; choices += setup.ALIAS.enc_moreDetail('WHAT DO THEY LOOK LIKE?', "look", 'stalker', {'hotkey':'W'}); choices += setup.ALIAS.enc_showChoices({ 'TALK' : "talk", 'WALK AWAY' : "walk", 'FIGHT' : "fight", }, 'stalker' ); return choices; }, 'look' : function() { return (_P2.TRAITS.gender=='male'?'He':'She')+" is a "+ setup.ALIAS.descAge(_P2.METRICS.age) +' '+ _P2.genpro + ", roughly " + setup.ALIAS.estAge(_P2.METRICS.age) + ", about "+ _P2.ht +" tall, and looks to weigh about "+ _P2.wt +" and you can't be sure, but it looks like "+(_P2.TRAITS.gender=='male'?'his':'her')+" arms are about " + _P2.bicep +" around."; }, 'talk' : function() { setup.ALIAS.showSideBar(); return "When you ask "+(_P2.TRAITS.gender=='male'?'him':'her')+" what "+(_P2.TRAITS.gender=='male'?'he':'she')+" wants, "+(_P2.TRAITS.gender=='male'?'he':'she')+" "+ either('flees', 'runs off', 'runs away', 'runs', 'retreats', 'takes off') +"."+ "<p class='keypress' key='[SPACE]'><<link 'CONTINUE'>><<unset _encounter>><<print setup.ALIAS.reloadPassage();>><</link>></p>"; /* setup.PASSAGES[$G.PC.STATE.lastPassage].exit(); */ }, 'walk' : function() { setup.ALIAS.showSideBar(); setup.ALIAS.giveFeedback('You walk off, leaving the strange '+(_P2.TRAITS.gender=='male'?'man':'woman')+' behind.'); return "<<goto 'GO HOME'>>"; }, 'fight' : function() { return setup.ENCOUNTERS['random_opponent'].replacePassage(); }, }, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return "<p>You notice a strange person following you...</p>" + '<div>'+ setup.ENCOUNTERS.stalker.CHOICES.whatDoYouDo() +'</div>'; }, 'afterPassage' : function() { return setup.ENCOUNTERS['random_opponent'].afterPassage(); }, }, /* END xxxx */ /* xxxx */ 'enemy':{ 'setup' : function() { var ENEMY_NAMES = Object.keys($G.PC.ENEMIES); var enemy_ct = ENEMY_NAMES.length; if(enemy_ct>0) { var randEnemy = setup.ALIAS.rand(1, enemy_ct, true)-1; var enemy_id = ENEMY_NAMES[randEnemy]; var P2 = $G.PC.ENEMIES[enemy_id]; /* setup.ALIAS.statGet(stat, secAlias, CHAR); */ var S = setup.ALIAS.statGet('all', 'current', P2); /* When your not training, Someone else is training, To kick your Ass! */ setup.ALIAS.enemyBigger(P2, setup.ALIAS.rand(0.005, 0.015)); /* recover 3-9/6 old max qi, come in overcharged */ setup.ALIAS.qiAdd((S.level**2)*setup.ALIAS.rand(3,9), P2); setup.ALIAS.qiFlow(0.134, 1, P2); setup.ALIAS.do_status_update(P2); setup.ALIAS.combat_refreshFighterInfo(P2); setup.ALIAS.combat_refreshFighterCondition(P2); State.setVar( '_P2', P2 ); setup.ENCOUNTERS.combat.setup(); } return ''; }, 'replace' : true, 'overrideExit' : true, 'hideMenu' : true, 'CHOICES' :{ 'whatDoYouDo' : function() { var choices = ''; choices += setup.ALIAS.enc_moreDetail('HOW MUCH BIGGER?', "look", 'enemy', {'hotkey':'W'}); choices += setup.ALIAS.enc_showChoices({ 'FIGHT' : "fight", }, 'enemy' ); return choices; }, 'look' : function() { return (_P2.TRAITS.gender=='male'?'He':'She')+" is a "+ setup.ALIAS.descAge(_P2.METRICS.age) +' '+ _P2.genpro + ", roughly " + setup.ALIAS.estAge(_P2.METRICS.age) + ", about "+ _P2.ht +" tall, and looks to weigh about "+ _P2.wt +" and you can't be sure, but it looks like "+(_P2.TRAITS.gender=='male'?'his':'her')+" arms are about " + _P2.bicep +" around."; }, 'fight' : function() { return setup.ENCOUNTERS['random_opponent'].replacePassage(); }, }, 'beforePassage' : function() { var enemy_ct = Object.keys($G.PC.ENEMIES).length; /* if enemy found, have encounter, else skip */ if(enemy_ct<1) { setup.ALIAS.showSideBar(); State.setVar('_encounter', 'nothing'); } return ''; }, 'replacePassage' : function() { return "<p>You notice a familiar person following you... it's "+ _P2.name +", "+ setup.ALIAS.he_she(_P2.TRAITS.gender) +" looks a bit bigger than the last time you saw "+ setup.ALIAS.him_her(_P2.TRAITS.gender) +", and "+ setup.ALIAS.he_she(_P2.TRAITS.gender) +"'s on you before you have a chace to react.</p>" + '<div>'+ setup.ENCOUNTERS.enemy.CHOICES.whatDoYouDo() +'</div>'; }, 'afterPassage' : function() { return setup.ENCOUNTERS['random_opponent'].afterPassage(); }, }, /* END xxxx */ /* xxxx */ 'customer':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, /* END xxxx */ /* xxxx */ 'employee':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, /* END xxxx */ /* xxxx */ 'vagrant':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, /* END xxxx */ /* xxxx */ 'drifter':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, /* END xxxx */ /* xxxx */ 'grifter':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, /* END xxxx */ /* xxxx */ 'crafter':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, /* END xxxx */ /* xxxx */ 'vendor':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, /* END xxxx */ /* xxxx */ 'drunk':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, /* END xxxx */ /* xxxx */ 'cop':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, /* END xxxx */ /* xxxx */ 'gymrat':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, /* END xxxx */ 'townsfolk':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'CHOICES' :{ 'whatDoYouDo' : function() { var choices = ''; choices += setup.ALIAS.enc_moreDetail('WHAT IS CHOICE 1', "choice1", _encounter, {'hotkey':'Q'}); choices += setup.ALIAS.enc_showChoices({ 'CHOICE 1' : "choice1", }, _encounter ); return choices; }, 'choice1' : function() { var out='ya had ta pick #1'; return out + setup.PASSAGES[$G.PC.STATE.lastPassage].exit(); }, }, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, /* xxxx */ 'KATIE':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'CHOICES' :{ 'whatDoYouDo' : function() { var choices = ''; choices += setup.ALIAS.enc_moreDetail('WHAT IS CHOICE 1', "choice1", 'TEMPLATE', {'hotkey':'Q'}); choices += setup.ALIAS.enc_showChoices({ 'CHOICE 1' : "choice1", }, 'TEMPLATE' ); return choices; }, 'haveShards' : function() { var choices = ''; choices += setup.ALIAS.enc_moreDetail('Wait, how is it you're munchin' those cookies and ain't got an ounce of fat on ya?!', "fat-free wafers", 'KATIE', {'hotkey':'Q'}); var canHazShards=false; var CHOICES={}; if($G.PC.R.S.primal) { canHazShards=true; CHOICES['GIVE HER A LIFE SHARD']="giveLife"; choices += "<p class='narrow'><span class='npc_reaction female'>"Oooh... pretty." :3</span></p>"; } if($G.PC.R.S.blood) { canHazShards=true; CHOICES['GIVE HER A BLOOD SHARD']="giveBlood"; choices += "<p class='narrow'><span class='npc_reaction female'>"The boss likes these..." :3</span></p>"; } if($G.PC.R.S.chrono) { canHazShards=true; CHOICES['GIVE HER A TIME SHARD']="giveTime"; choices += "<p class='narrow'><span class='npc_reaction female'>"What is that??" :3</span></p>"; } State.setVar('_canHazShards', canHazShards); if(canHazShards) { choices += setup.ALIAS.enc_showChoices(CHOICES, 'KATIE'); } return choices; }, 'fat-free wafers' : function() { var out=(_canHazShards ? 'Give me a shard and I'll tell you my secret! :3' : 'Katie just smiles and laughs.'); return out; }, 'giveLife' : function() { var out="Her tail wags back and forth as she takes the shard, and hands you a bottle marked "Anabolic Muscle Activation Zone", that' a mouthfull... perhaps you could just call it A-MA Zone for short. <span class='npc_reaction female'>"Hey, I know a lady who collects these... she's in that bookstore on the edge of the park."</span>"; setup.ALIAS.addItem('items.Supplements.AMAZone', $G.PC); $G.PC.R.S.primal--; setup.ALIAS.worldVarSet('parkhaven.mentioned', true); return out; }, 'giveBlood' : function() { var out="Her tail wags back and forth as she takes the shard, and hands you a bottle marked "DeviLabs Fat Burner", there's a warning on the label that says "save well before using"... wait, is that a typo? <span class='npc_reaction female'>"Where'd you say you got these? That one smells familiar..."</span>"; setup.ALIAS.addItem('items.Supplements.DeviLabs', $G.PC); $G.PC.R.S.blood--; return out; }, 'giveTime' : function() { var out="Her tail wags back and forth as she takes the shard. <span class='npc_reaction female'>"It almost feels like I can be in two places at once!" :3</span>"; /* ??? -- unlock her as a playable character? :3 */ /* $G.PC.R.S.chrono--; */ return out; }, 'choice1' : function() { var out='ya had ta pick #1'; return out; }, }, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, /* END xxxx */ /* xxxx */ 'AliciaWelstrom':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'CHOICES' :{ 'whatDoYouDo' : function() { var choices = ''; choices += setup.ALIAS.enc_moreDetail('WHAT IS CHOICE 1', "choice1", 'TEMPLATE', {'hotkey':'Q'}); choices += setup.ALIAS.enc_showChoices({ 'CHOICE 1' : "choice1", }, 'TEMPLATE' ); return choices; }, 'haveShards' : function() { var choices = ''; /* choices += setup.ALIAS.enc_moreDetail("let's talk about something...", "xxxx", 'AliciaWelstrom', {'hotkey':'Q'}); */ var CHOICES={}; var optNum=0; if($G.PC.R.S.primal) { CHOICES['GIVE HER A LIFE SHARD']="giveLife"; optNum++; choices += "<p class='narrow'>("+optNum+") <span class='npc_reaction female'>"You have primal essence to trade? Well, why didn't you say so."</span></p>"; } if($G.PC.R.S.blood) { CHOICES['GIVE HER A BLOOD SHARD']="giveBlood"; optNum++; choices += "<p class='narrow'>("+optNum+") <span class='npc_reaction female'>"A Blood-Shard? Please don't bring such acursed things into this sacred space..."</span></p>"; } if($G.PC.R.S.chrono) { CHOICES['GIVE HER A TIME SHARD']="giveTime"; optNum++; choices += "<p class='narrow'>("+optNum+") <span class='npc_reaction female'>"You've frozen a drop of time itself? Okay, color me impressed."</span></p>"; } choices += setup.ALIAS.enc_showChoices(CHOICES, 'AliciaWelstrom'); return choices; }, 'giveLife' : function() { var out=''; setup.ALIAS.worldVarAdd('parkhaven.givenShards', 1); if(setup.ALIAS.worldVarGet('parkhaven.givenShards')>1) { out+="She gazes into your soul as she takes the shard, <span class='npc_reaction female'>"Thank you."</span>"; } else { out+="Alice smiles as she takes the shard, <span class='npc_reaction female'>"There's more to you than meets the eye"+(setup.ALIAS.weightGet('bodytone', $G.PC)>0.65 ? "... and the eye isn't left wanting" : "")+". I might a few more things of interest to you, [[let me show you->PARKHAVEN]]."</span>"; } $G.PC.R.S.primal--; return out; }, 'giveBlood' : function() { var out="<span class='npc_reaction female'>"I ask you not to bring dark relics like this into my home."</span>"; return out; }, 'giveTime' : function() { var out="She examines the shard. <span class='npc_reaction female'>"Fascinating, but it seems bound to you... why don't you keep it." :3</span>"; return out; }, 'choice1' : function() { var out='ya had ta pick #1'; return out; }, }, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, /* END xxxx */ /* GYM ENCOUNTERS */ /* BodyBuilder Athlete Out-of-Shape... townsfolk... (random occupation, appearence, etc.) Meat-Head... */ 'gym: bodybuilder':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'CHOICES' :{ 'whatDoYouDo' : function() { var choices = ''; choices += setup.ALIAS.enc_moreDetail('WHAT IS CHOICE 1', "choice1", _encounter, {'hotkey':'Q'}); choices += setup.ALIAS.enc_showChoices({ 'CHOICE 1' : "choice1", }, _encounter ); return choices; }, 'choice1' : function() { var out='ya had ta pick #1'; return out + setup.PASSAGES[$G.PC.STATE.lastPassage].exit(); }, }, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'gym: athlete':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'CHOICES' :{ 'whatDoYouDo' : function() { var choices = ''; choices += setup.ALIAS.enc_moreDetail('WHAT IS CHOICE 1', "choice1", _encounter, {'hotkey':'Q'}); choices += setup.ALIAS.enc_showChoices({ 'CHOICE 1' : "choice1", }, _encounter ); return choices; }, 'choice1' : function() { var out='ya had ta pick #1'; return out + setup.PASSAGES[$G.PC.STATE.lastPassage].exit(); }, }, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'gym: out-of-shape':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'CHOICES' :{ 'whatDoYouDo' : function() { var choices = ''; choices += setup.ALIAS.enc_moreDetail('WHAT IS CHOICE 1', "choice1", _encounter, {'hotkey':'Q'}); choices += setup.ALIAS.enc_showChoices({ 'CHOICE 1' : "choice1", }, _encounter ); return choices; }, 'choice1' : function() { var out='ya had ta pick #1'; return out + setup.PASSAGES[$G.PC.STATE.lastPassage].exit(); }, }, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'gym: meat-head':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'CHOICES' :{ 'whatDoYouDo' : function() { var choices = ''; choices += setup.ALIAS.enc_moreDetail('WHAT IS CHOICE 1', "choice1", _encounter, {'hotkey':'Q'}); choices += setup.ALIAS.enc_showChoices({ 'CHOICE 1' : "choice1", }, _encounter ); return choices; }, 'choice1' : function() { var out='ya had ta pick #1'; return out + setup.PASSAGES[$G.PC.STATE.lastPassage].exit(); }, }, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'gym: staff':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'CHOICES' :{ 'whatDoYouDo' : function() { var choices = ''; choices += setup.ALIAS.enc_moreDetail('WHAT IS CHOICE 1', "choice1", _encounter, {'hotkey':'Q'}); choices += setup.ALIAS.enc_showChoices({ 'CHOICE 1' : "choice1", }, _encounter ); return choices; }, 'choice1' : function() { var out='ya had ta pick #1'; return out + setup.PASSAGES[$G.PC.STATE.lastPassage].exit(); }, }, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'gym: townsfolk':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'CHOICES' :{ 'whatDoYouDo' : function() { var choices = ''; choices += setup.ALIAS.enc_moreDetail('WHAT IS CHOICE 1', "choice1", _encounter, {'hotkey':'Q'}); choices += setup.ALIAS.enc_showChoices({ 'CHOICE 1' : "choice1", }, _encounter ); return choices; }, 'choice1' : function() { var out='ya had ta pick #1'; return out + setup.PASSAGES[$G.PC.STATE.lastPassage].exit(); }, }, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'gym-patron':{ 'setup' : function() { setup.ENCOUNTERS['gym-combat'].setup(); }, 'replace' : true, 'overrideExit' : true, 'hideMenu' : true, 'CHOICES' :{ 'whatDoYouDo' : function(CHOICES, HINTS, PARAMS) { var choices = ' what do you do?'; /* DUE TO A TECHNICAL LIMITATION, PARAMS ARE NOT PASSED TO the enc_ detail/choices function calls... so we need an alternate method */ State.setVar('_ENC_PARAMS', PARAMS); CHOICES = CHOICES||{ 'CONTINUE' : "v0Fight", }; /* hints unlocked... HINTS? */ Object.keys(HINTS).forEach(function(hint) { choices += setup.ALIAS.enc_moreDetail(hint, HINTS[hint].choice, _encounter, HINTS[hint].PARAMS); }); choices += setup.ALIAS.enc_showChoices(CHOICES, _encounter); return choices; }, 'continue' : function() { var out='ignoring them, you continue on...'; return out + setup.PASSAGES[$G.PC.STATE.lastPassage].exit(); }, /* ENCOUNTER VARIATIONS */ 'generic' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; var out=' you see a '+(PARAMS.f ? 'girl' : 'boy'); /* hints unlocked... HINTS? */ var HINTS={}; var CHOICES={ /* ['TALK TO '+(PARAMS.f ?'HER' :'HIM')] : 'v0Ambush', */ ['IGNORE ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Leave', ['ATTACK ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Attack', }; var PARAMS={}; PARAMS.eLast='generic'; return out+setup.ENCOUNTERS[_encounter].CHOICES.whatDoYouDo(CHOICES, HINTS, PARAMS); }, /* READY TO GO: */ 'v0Leave' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=' you decide it's none of your business... '; switch(PARAMS.eLast) { case 'xxxx': out+=''; break; default: out+=''; break; } PARAMS.eLast='v0Leave'; setup.ALIAS.showSideBar(); return out+setup.ALIAS.reloadPassage(); }, 'v0Escape' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=' you manage to get away... '; switch(PARAMS.eLast) { case 'xxxx': out+=''; break; default: out+=''; break; } PARAMS.eLast='v0Escape'; setup.ALIAS.showSideBar(PARAMS); return out+setup.PASSAGES[$G.PC.STATE.lastPassage].exit(); }, 'v0Ambush' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; var out=' '+(PARAMS.f ?'she' :'he')+' attacks...'; switch(PARAMS.eLast) { case 'xxxx': out+=''; break; default: out+=''; break; } PARAMS.eLast='v0Ambush'; return out+setup.ENCOUNTERS[_encounter].CHOICES['v0Fight'](PARAMS); }, 'v0Attack' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; var out=' You lunge at '+(PARAMS.f ?'her' :'him')+' ... '; switch(PARAMS.eLast) { case 'xxxx': out+=''; break; default: out+=''; break; } PARAMS.eLast='v0Attack'; return out+setup.ENCOUNTERS[_encounter].CHOICES['v0Fight'](PARAMS); }, 'v0Fight' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; return setup.ENCOUNTERS['gym-combat'].replacePassage(); }, }, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { var sX=setup.ALIAS; var S2=sX.statGet('all', 'current', _P2); var PARAMS={ 'f' : ('she'===sX.he_she(_P2.TRAITS.gender)), 'age' : _P2.METRICS.age, 'STATS' : S2, 'eLast' : 'start', }; var VARIATIONS={ 'generic' : 10, }; var sub_encounter = sX.spinTheWheel(VARIATIONS); return '<div>'+ setup.ENCOUNTERS[_encounter].CHOICES[sub_encounter](PARAMS) +'</div>'; }, 'afterPassage' : function() { return ''; }, }, 'gym-combat':{ 'setup' : function() { var sX=setup.ALIAS; var P2=sX.generateCreature('species.human.gym_goer'); P2.actor='cpu-mob'; sX.combat_loadP2(P2); setup.ENCOUNTERS.combat.setup(); return ''; }, 'replace' : true, 'overrideExit' : true, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return setup.ENCOUNTERS['combat'].replacePassage(); }, 'afterPassage' : function() { return setup.ENCOUNTERS['combat'].afterPassage(); }, }, 'rvh-student':{ 'setup' : function() { setup.ENCOUNTERS['rvh-student-combat'].setup(); }, 'replace' : true, 'overrideExit' : true, 'hideMenu' : true, 'CHOICES' :{ 'whatDoYouDo' : function(CHOICES, HINTS, PARAMS) { var choices = ' what do you do?'; /* DUE TO A TECHNICAL LIMITATION, PARAMS ARE NOT PASSED TO the enc_ detail/choices function calls... so we need an alternate method */ State.setVar('_ENC_PARAMS', PARAMS); CHOICES = CHOICES||{ 'CONTINUE' : "v0Fight", }; /* hints unlocked... HINTS? */ Object.keys(HINTS).forEach(function(hint) { choices += setup.ALIAS.enc_moreDetail(hint, HINTS[hint].choice, _encounter, HINTS[hint].PARAMS); }); choices += setup.ALIAS.enc_showChoices(CHOICES, _encounter); return choices; }, 'continue' : function() { var out='ignoring them, you continue on...'; return out + setup.PASSAGES[$G.PC.STATE.lastPassage].exit(); }, /* ENCOUNTER VARIATIONS */ 'generic' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; var out=' you see a '+(PARAMS.f ? 'girl' : 'boy'); /* hints unlocked... HINTS? */ var HINTS={}; var CHOICES={ /* ['TALK TO '+(PARAMS.f ?'HER' :'HIM')] : 'v0Ambush', */ ['IGNORE ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Leave', ['ATTACK ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Attack', }; var PARAMS={}; PARAMS.eLast='generic'; return out+setup.ENCOUNTERS[_encounter].CHOICES.whatDoYouDo(CHOICES, HINTS, PARAMS); }, /* READY TO GO: */ 'v0Leave' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=' you decide it's none of your business... '; switch(PARAMS.eLast) { case 'xxxx': out+=''; break; default: out+=''; break; } PARAMS.eLast='v0Leave'; setup.ALIAS.showSideBar(); return out+setup.ALIAS.reloadPassage(); }, 'v0Escape' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=' you manage to get away... '; switch(PARAMS.eLast) { case 'xxxx': out+=''; break; default: out+=''; break; } PARAMS.eLast='v0Escape'; setup.ALIAS.showSideBar(PARAMS); return out+setup.PASSAGES[$G.PC.STATE.lastPassage].exit(); }, 'v0Ambush' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; var out=' '+(PARAMS.f ?'she' :'he')+' attacks...'; switch(PARAMS.eLast) { case 'xxxx': out+=''; break; default: out+=''; break; } PARAMS.eLast='v0Ambush'; return out+setup.ENCOUNTERS[_encounter].CHOICES['v0Fight'](PARAMS); }, 'v0Attack' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; var out=' You lunge at '+(PARAMS.f ?'her' :'him')+' ... '; switch(PARAMS.eLast) { case 'xxxx': out+=''; break; default: out+=''; break; } PARAMS.eLast='v0Attack'; return out+setup.ENCOUNTERS[_encounter].CHOICES['v0Fight'](PARAMS); }, 'v0Fight' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; return setup.ENCOUNTERS['rvh-student-combat'].replacePassage(); }, }, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { var sX=setup.ALIAS; var S2=sX.statGet('all', 'current', _P2); var PARAMS={ 'f' : ('she'===sX.he_she(_P2.TRAITS.gender)), 'age' : _P2.METRICS.age, 'STATS' : S2, 'eLast' : 'start', }; var VARIATIONS={ 'generic' : 10, }; var sub_encounter = sX.spinTheWheel(VARIATIONS); return '<div>'+ setup.ENCOUNTERS[_encounter].CHOICES[sub_encounter](PARAMS) +'</div>'; }, 'afterPassage' : function() { return ''; }, }, 'rvh-student-combat':{ 'setup' : function() { var sX=setup.ALIAS; var P2=sX.generateCreature('species.human.rvh_student'); P2.actor='cpu-mob'; sX.combat_loadP2(P2); setup.ENCOUNTERS.combat.setup(); return ''; }, 'replace' : true, 'overrideExit' : true, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return setup.ENCOUNTERS['combat'].replacePassage(); }, 'afterPassage' : function() { return setup.ENCOUNTERS['combat'].afterPassage(); }, }, 'inmate':{ 'setup' : function() { setup.ENCOUNTERS['prison-combat'].setup(); }, 'replace' : true, 'overrideExit' : true, 'hideMenu' : true, 'CHOICES' :{ 'whatDoYouDo' : function(CHOICES, HINTS, PARAMS) { var choices = ' what do you do?'; /* DUE TO A TECHNICAL LIMITATION, PARAMS ARE NOT PASSED TO the enc_ detail/choices function calls... so we need an alternate method */ State.setVar('_ENC_PARAMS', PARAMS); CHOICES = CHOICES||{ 'CONTINUE' : "v0Fight", }; /* hints unlocked... HINTS? */ Object.keys(HINTS).forEach(function(hint) { choices += setup.ALIAS.enc_moreDetail(hint, HINTS[hint].choice, _encounter, HINTS[hint].PARAMS); }); choices += setup.ALIAS.enc_showChoices(CHOICES, _encounter); return choices; }, 'continue' : function() { var out='ignoring them, you continue on...'; return out + setup.PASSAGES[$G.PC.STATE.lastPassage].exit(); }, /* ENCOUNTER VARIATIONS */ 'generic' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; var out=' you see a '+(PARAMS.f ? 'girl' : 'boy'); /* hints unlocked... HINTS? */ var HINTS={}; var CHOICES={ /* ['TALK TO '+(PARAMS.f ?'HER' :'HIM')] : 'v0Ambush', */ ['IGNORE ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Leave', ['ATTACK ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Attack', }; var PARAMS={}; PARAMS.eLast='generic'; return out+setup.ENCOUNTERS[_encounter].CHOICES.whatDoYouDo(CHOICES, HINTS, PARAMS); }, /* READY TO GO: */ 'v0Leave' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=' you decide it's none of your business... '; switch(PARAMS.eLast) { case 'xxxx': out+=''; break; default: out+=''; break; } PARAMS.eLast='v0Leave'; setup.ALIAS.showSideBar(); return out+setup.ALIAS.reloadPassage(); }, 'v0Escape' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=' you manage to get away... '; switch(PARAMS.eLast) { case 'xxxx': out+=''; break; default: out+=''; break; } PARAMS.eLast='v0Escape'; setup.ALIAS.showSideBar(PARAMS); return out+setup.PASSAGES[$G.PC.STATE.lastPassage].exit(); }, 'v0Ambush' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; var out=' '+(PARAMS.f ?'she' :'he')+' attacks...'; switch(PARAMS.eLast) { case 'xxxx': out+=''; break; default: out+=''; break; } PARAMS.eLast='v0Ambush'; return out+setup.ENCOUNTERS[_encounter].CHOICES['v0Fight'](PARAMS); }, 'v0Attack' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; var out=' You lunge at '+(PARAMS.f ?'her' :'him')+' ... '; switch(PARAMS.eLast) { case 'xxxx': out+=''; break; default: out+=''; break; } PARAMS.eLast='v0Attack'; return out+setup.ENCOUNTERS[_encounter].CHOICES['v0Fight'](PARAMS); }, 'v0Fight' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; return setup.ENCOUNTERS['prison-combat'].replacePassage(); }, }, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { var sX=setup.ALIAS; var S2=sX.statGet('all', 'current', _P2); var PARAMS={ 'f' : ('she'===sX.he_she(_P2.TRAITS.gender)), 'age' : _P2.METRICS.age, 'STATS' : S2, 'eLast' : 'start', }; var VARIATIONS={ 'generic' : 10, }; var sub_encounter = sX.spinTheWheel(VARIATIONS); return '<div>'+ setup.ENCOUNTERS[_encounter].CHOICES[sub_encounter](PARAMS) +'</div>'; }, 'afterPassage' : function() { return ''; }, }, 'prison-combat':{ 'setup' : function() { var sX=setup.ALIAS; var P2=sX.generateCreature('species.human.inmate'); P2.actor='cpu-mob'; sX.combat_loadP2(P2); setup.ENCOUNTERS.combat.setup(); return ''; }, 'replace' : true, 'overrideExit' : true, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return setup.ENCOUNTERS['combat'].replacePassage(); }, 'afterPassage' : function() { return setup.ENCOUNTERS['combat'].afterPassage(); }, }, 'NPC-Mossberg':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'CHOICES' :{ 'whatDoYouDo' : function() { var choices = ''; choices += setup.ALIAS.enc_moreDetail('WHAT IS CHOICE 1', "choice1", _encounter, {'hotkey':'Q'}); choices += setup.ALIAS.enc_showChoices({ 'CHOICE 1' : "choice1", }, _encounter ); return choices; }, 'choice1' : function() { var out='ya had ta pick #1'; return out + setup.PASSAGES[$G.PC.STATE.lastPassage].exit(); }, }, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'customer':{ 'setup' : function() { setup.ENCOUNTERS['customer-combat'].setup(); }, 'replace' : true, 'overrideExit' : true, 'hideMenu' : true, 'CHOICES' :{ 'whatDoYouDo' : function(CHOICES, HINTS, PARAMS) { var choices = ' what do you do?'; /* DUE TO A TECHNICAL LIMITATION, PARAMS ARE NOT PASSED TO the enc_ detail/choices function calls... so we need an alternate method */ State.setVar('_ENC_PARAMS', PARAMS); CHOICES = CHOICES||{ 'CONTINUE' : "v0Fight", }; /* hints unlocked... HINTS? */ Object.keys(HINTS).forEach(function(hint) { choices += setup.ALIAS.enc_moreDetail(hint, HINTS[hint].choice, _encounter, HINTS[hint].PARAMS); }); choices += setup.ALIAS.enc_showChoices(CHOICES, _encounter); return choices; }, 'continue' : function() { var out='ignoring them, you continue on...'; return out + setup.PASSAGES[$G.PC.STATE.lastPassage].exit(); }, /* ENCOUNTER VARIATIONS */ 'generic' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; var out=' you see a '+(PARAMS.f ? 'girl' : 'boy'); /* hints unlocked... HINTS? */ var HINTS={}; var CHOICES={ /* ['TALK TO '+(PARAMS.f ?'HER' :'HIM')] : 'v0Ambush', */ ['IGNORE ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Leave', ['ATTACK ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Attack', }; var PARAMS={}; PARAMS.eLast='generic'; return out+setup.ENCOUNTERS[_encounter].CHOICES.whatDoYouDo(CHOICES, HINTS, PARAMS); }, /* READY TO GO: */ 'v0Leave' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=' you decide it's none of your business... '; switch(PARAMS.eLast) { case 'xxxx': out+=''; break; default: out+=''; break; } PARAMS.eLast='v0Leave'; setup.ALIAS.showSideBar(); return out+setup.ALIAS.reloadPassage(); }, 'v0Escape' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=' you manage to get away... '; switch(PARAMS.eLast) { case 'xxxx': out+=''; break; default: out+=''; break; } PARAMS.eLast='v0Escape'; setup.ALIAS.showSideBar(PARAMS); return out+setup.PASSAGES[$G.PC.STATE.lastPassage].exit(); }, 'v0Ambush' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; var out=' '+(PARAMS.f ?'she' :'he')+' attacks...'; switch(PARAMS.eLast) { case 'xxxx': out+=''; break; default: out+=''; break; } PARAMS.eLast='v0Ambush'; return out+setup.ENCOUNTERS[_encounter].CHOICES['v0Fight'](PARAMS); }, 'v0Attack' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; var out=' You lunge at '+(PARAMS.f ?'her' :'him')+' ... '; switch(PARAMS.eLast) { case 'xxxx': out+=''; break; default: out+=''; break; } PARAMS.eLast='v0Attack'; return out+setup.ENCOUNTERS[_encounter].CHOICES['v0Fight'](PARAMS); }, 'v0Fight' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; return setup.ENCOUNTERS['prison-combat'].replacePassage(); }, }, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { var sX=setup.ALIAS; var S2=sX.statGet('all', 'current', _P2); var PARAMS={ 'f' : ('she'===sX.he_she(_P2.TRAITS.gender)), 'age' : _P2.METRICS.age, 'STATS' : S2, 'eLast' : 'start', }; var VARIATIONS={ 'generic' : 10, }; var sub_encounter = sX.spinTheWheel(VARIATIONS); return '<div>'+ setup.ENCOUNTERS[_encounter].CHOICES[sub_encounter](PARAMS) +'</div>'; }, 'afterPassage' : function() { return ''; }, }, 'customer-combat':{ 'setup' : function() { var sX=setup.ALIAS; var P2=sX.generateCreature('species.human'); P2.actor='cpu-mob'; sX.combat_loadP2(P2); setup.ENCOUNTERS.combat.setup(); return ''; }, 'replace' : true, 'overrideExit' : true, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return setup.ENCOUNTERS['combat'].replacePassage(); }, 'afterPassage' : function() { return setup.ENCOUNTERS['combat'].afterPassage(); }, }, /* PARK ENCOUNTERS */ /* DAY NIGHT Jogger Vampire (possible bad end or turn on vamp?) Nymph Succubus (possible bad end, if die of exhaustion/qi-loss... unlikely but possible) Athlete Demon Townsfolk Zombies? Litter Rift Virgin Werewolf? Cave? Cave? Parkhaven ...? Stalker Enemy */ /* not just joggers, but general park-goers engaged in a variety of daytime activities... */ 'jogger':{ 'setup' : function() { setup.ENCOUNTERS['jogger-combat'].setup(); }, 'replace' : true, 'overrideExit' : true, 'hideMenu' : true, 'CHOICES' :{ 'whatDoYouDo' : function(CHOICES, HINTS, PARAMS) { var choices = ' what do you do?'; /* DUE TO A TECHNICAL LIMITATION, PARAMS ARE NOT PASSED TO the enc_ detail/choices function calls... so we need an alternate method */ State.setVar('_ENC_PARAMS', PARAMS); CHOICES = CHOICES||{ 'CONTINUE' : "v0Fight", }; /* hints unlocked... HINTS? */ Object.keys(HINTS).forEach(function(hint) { choices += setup.ALIAS.enc_moreDetail(hint, HINTS[hint].choice, _encounter, HINTS[hint].PARAMS); }); choices += setup.ALIAS.enc_showChoices(CHOICES, _encounter); return choices; }, 'continue' : function() { var out='ignoring them, you continue on...'; return out + setup.PASSAGES[$G.PC.STATE.lastPassage].exit(); }, /* ENCOUNTER VARIATIONS */ 'generic' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; var out=' you see a '+(PARAMS.f ? 'girl' : 'boy'); /* hints unlocked... HINTS? */ var HINTS={}; var CHOICES={ /* ['TALK TO '+(PARAMS.f ?'HER' :'HIM')] : 'v0Ambush', */ ['IGNORE ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Leave', ['ATTACK ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Attack', }; var PARAMS={}; PARAMS.eLast='generic'; return out+setup.ENCOUNTERS[_encounter].CHOICES.whatDoYouDo(CHOICES, HINTS, PARAMS); }, /* READY TO GO: */ 'v0Leave' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=' you decide it's none of your business... '; switch(PARAMS.eLast) { case 'xxxx': out+=''; break; default: out+=''; break; } PARAMS.eLast='v0Leave'; setup.ALIAS.showSideBar(); return out+setup.ALIAS.reloadPassage(); }, 'v0Escape' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=' you manage to get away... '; switch(PARAMS.eLast) { case 'xxxx': out+=''; break; default: out+=''; break; } PARAMS.eLast='v0Escape'; setup.ALIAS.showSideBar(PARAMS); return out+setup.PASSAGES[$G.PC.STATE.lastPassage].exit(); }, 'v0Ambush' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; var out=' '+(PARAMS.f ?'she' :'he')+' attacks...'; switch(PARAMS.eLast) { case 'xxxx': out+=''; break; default: out+=''; break; } PARAMS.eLast='v0Ambush'; return out+setup.ENCOUNTERS[_encounter].CHOICES['v0Fight'](PARAMS); }, 'v0Attack' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; var out=' You lunge at '+(PARAMS.f ?'her' :'him')+' ... '; switch(PARAMS.eLast) { case 'xxxx': out+=''; break; default: out+=''; break; } PARAMS.eLast='v0Attack'; return out+setup.ENCOUNTERS[_encounter].CHOICES['v0Fight'](PARAMS); }, 'v0Fight' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; return setup.ENCOUNTERS['jogger-combat'].replacePassage(); }, }, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { var sX=setup.ALIAS; var S2=sX.statGet('all', 'current', _P2); var PARAMS={ 'f' : ('she'===sX.he_she(_P2.TRAITS.gender)), 'age' : _P2.METRICS.age, 'STATS' : S2, 'eLast' : 'start', }; var VARIATIONS={ 'generic' : 10, }; var sub_encounter = sX.spinTheWheel(VARIATIONS); return '<div>'+ setup.ENCOUNTERS[_encounter].CHOICES[sub_encounter](PARAMS) +'</div>'; }, 'afterPassage' : function() { return ''; }, }, 'jogger-combat':{ 'setup' : function() { var sX=setup.ALIAS; var P2=sX.generateCreature('species.human'); P2.actor='cpu-mob'; sX.combat_loadP2(P2); setup.ENCOUNTERS.combat.setup(); return ''; }, 'replace' : true, 'overrideExit' : true, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return setup.ENCOUNTERS['combat'].replacePassage(); }, 'afterPassage' : function() { return setup.ENCOUNTERS['combat'].afterPassage(); }, }, 'vampire':{ 'setup' : function() { setup.ENCOUNTERS['vampire-combat'].setup(); }, 'replace' : true, 'overrideExit' : true, 'hideMenu' : true, 'CHOICES' :{ 'whatDoYouDo' : function(CHOICES, HINTS, PARAMS) { var choices = ' what do you do?'; /* DUE TO A TECHNICAL LIMITATION, PARAMS ARE NOT PASSED TO the enc_ detail/choices function calls... so we need an alternate method */ State.setVar('_ENC_PARAMS', PARAMS); CHOICES = CHOICES||{ 'CONTINUE' : "v0Fight", }; /* hints unlocked... HINTS? */ Object.keys(HINTS).forEach(function(hint) { choices += setup.ALIAS.enc_moreDetail(hint, HINTS[hint].choice, _encounter, HINTS[hint].PARAMS); }); choices += setup.ALIAS.enc_showChoices(CHOICES, _encounter); return choices; }, 'hint1' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; PARAMS.hint1=true; return 'no clue...'; }, 'vDrunk' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* real or trick? */ /* (PARAMS.eLast=='|') */ var out=' you see a '+(PARAMS.f ? 'woman' : 'man')+' '; switch(PARAMS.eLast) { case 'v1Prone': out+='passed out on a bench... '; break; case 'xxxx': out+=''; break; default: out+='stumbling through the park... '; break; } out+=' looks like'+(PARAMS.f ? 'she' : 'he')+''s been drinking... '; /* hints unlocked... HINTS? */ var HINTS={ 'HINT 1': {'choice':'hint1', 'PARAMS':{'hotkey':'Q'}}, }; var CHOICES={ ['CHECK ON '+(PARAMS.f ?'HER' :'HIM')] : 'v0Ambush', ['LEAVE ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Leave', ['ATTACK ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Attack', }; var PARAMS={}; PARAMS.eLast='vDrunk'; return out+setup.ENCOUNTERS[_encounter].CHOICES.whatDoYouDo(CHOICES, HINTS, PARAMS); }, 'vHelpMe' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* real or trick? */ /* (PARAMS.eLast=='|') */ var out=''; switch(PARAMS.eLast) { case 'v1Distress': out+=(PARAMS.f ? 'she' : 'he')+' is screaming for help... '; break; default: out+=''; break; } /* hints unlocked... HINTS? */ var HINTS={ 'HINT 1': {'choice':'hint1', 'PARAMS':{'hotkey':'Q'}}, }; var CHOICES={ ['CHECK ON '+(PARAMS.f ?'HER' :'HIM')] : 'v0Ambush', ['IGNORE ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Leave', ['ATTACK ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Attack', }; var PARAMS={}; PARAMS.eLast='vHelpMe'; return out+setup.ENCOUNTERS[_encounter].CHOICES.whatDoYouDo(CHOICES, HINTS, PARAMS); }, 'vInjured' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* real or trick? */ /* (PARAMS.eLast=='|') */ var out=(PARAMS.f ? 'she' : 'he')+' appears to be injured... '; switch(PARAMS.eLast) { case 'v1Distress': out+=''; break; case 'v1Prone': out+=''; break; default: out+=''; break; } /* hints unlocked... HINTS? */ var HINTS={ 'HINT 1': {'choice':'hint1', 'PARAMS':{'hotkey':'Q'}}, }; var CHOICES={ ['CHECK ON '+(PARAMS.f ?'HER' :'HIM')] : 'v0Ambush', ['IGNORE ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Leave', ['ATTACK ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Attack', }; var PARAMS={}; PARAMS.eLast='vInjured'; return out+setup.ENCOUNTERS[_encounter].CHOICES.whatDoYouDo(CHOICES, HINTS, PARAMS); }, 'vRunning' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* real or trick? */ /* (PARAMS.eLast=='|') */ var out=(PARAMS.f ? 'she' : 'he')+''s running... '; switch(PARAMS.eLast) { case 'v1Distress': out+=''; break; default: out+=''; break; } /* hints unlocked... HINTS? */ var HINTS={ 'HINT 1': {'choice':'hint1', 'PARAMS':{'hotkey':'Q'}}, }; var CHOICES={ ['CHECK ON '+(PARAMS.f ?'HER' :'HIM')] : 'v0Ambush', ['IGNORE ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Leave', ['ATTACK ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Attack', }; var PARAMS={}; PARAMS.eLast='vRunning'; return out+setup.ENCOUNTERS[_encounter].CHOICES.whatDoYouDo(CHOICES, HINTS, PARAMS); }, 'vLurking' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=''; switch(PARAMS.eLast) { case 'v2FoundBody': out+=''; break; case 'v1Corpse': out+=''; break; default: out+=''; break; } /* hints unlocked... HINTS? */ var HINTS={ 'HINT 1': {'choice':'hint1', 'PARAMS':{'hotkey':'Q'}}, }; var CHOICES={ 'CONTINUE': 'v0Ambush', }; var PARAMS={}; PARAMS.eLast='vLurking'; return out+setup.ENCOUNTERS[_encounter].CHOICES.whatDoYouDo(CHOICES, HINTS, PARAMS); }, 'vTorpor' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=' whoever they were, they appear to be dead... '; switch(PARAMS.eLast) { case 'v2FoundBody': out+=''; break; case 'v1Corpse': out+=''; break; default: out+=''; break; } /* hints unlocked... HINTS? */ var HINTS={ 'HINT 1': {'choice':'hint1', 'PARAMS':{'hotkey':'Q'}}, }; var CHOICES={ ['CHECK ON '+(PARAMS.f ?'HER' :'HIM')] : 'v0Ambush', ['IGNORE ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Leave', ['ATTACK ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Attack', }; var PARAMS={}; PARAMS.eLast='vTorpor'; return out+setup.ENCOUNTERS[_encounter].CHOICES.whatDoYouDo(CHOICES, HINTS, PARAMS); }, 'vPossum' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=' whoever they were, they appear to be dead... '; switch(PARAMS.eLast) { case 'v2FoundBody': out+=''; break; case 'v1Corpse': out+=''; break; default: out+=''; break; } /* hints unlocked... HINTS? */ var HINTS={ 'HINT 1': {'choice':'hint1', 'PARAMS':{'hotkey':'Q'}}, }; var CHOICES={ ['CHECK ON '+(PARAMS.f ?'HER' :'HIM')] : 'v0Ambush', ['IGNORE ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Leave', ['ATTACK ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Attack', }; var PARAMS={}; PARAMS.eLast='vPossum'; return out+setup.ENCOUNTERS[_encounter].CHOICES.whatDoYouDo(CHOICES, HINTS, PARAMS); }, 'vTurned' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=' whoever they were, they appear to be dead... '; switch(PARAMS.eLast) { case 'v2FoundBody': out+=''; break; /* case 'v1Corpse': out+=''; break; */ default: out+=''; break; } /* hints unlocked... HINTS? */ var HINTS={ 'HINT 1': {'choice':'hint1', 'PARAMS':{'hotkey':'Q'}}, }; var CHOICES={ ['CHECK ON '+(PARAMS.f ?'HER' :'HIM')] : 'v0Ambush', ['IGNORE ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Leave', ['ATTACK ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Attack', }; var PARAMS={}; PARAMS.eLast='vTurned'; return out+setup.ENCOUNTERS[_encounter].CHOICES.whatDoYouDo(CHOICES, HINTS, PARAMS); }, 'v2FoundBody' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=' you come across the body of a '+(PARAMS.f ?'woman' :'man')+'... '; switch(PARAMS.eLast) { case 'v1Corpse': out+=''; break; case 'v1Prone': out+=''; break; default: out+=''; break; } var VARIATIONS={ 'vLurking' : 100*(PARAMS.f ?1 :3), 'vTorpor' : 100*(PARAMS.f ?1 :1)*(PARAMS.dead ? 100 : 0.01), 'vPossum' : 100*(PARAMS.f ?1 :1), 'vTurned' : 100*(PARAMS.f ?1 :1), 'vImagination' : 100*(PARAMS.f ?1 :1), }; PARAMS.eLast='v2FoundBody'; var sub_encounter = setup.ALIAS.spinTheWheel(VARIATIONS); setup.ALIAS.debugLog('[sub-encounter: '+sub_encounter+']'); return setup.ENCOUNTERS[_encounter].CHOICES[sub_encounter](PARAMS); }, 'vRapey' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=' '+(PARAMS.f ?'she' :'he')+' seems to be getting way too familiar ... '; switch(PARAMS.eLast) { case 'v1Encounter': out+=''; break; case 'v1Distress': out+=''; break; default: out+=''; break; } /* hints unlocked... HINTS? */ var HINTS={ 'HINT 1': {'choice':'hint1', 'PARAMS':{'hotkey':'Q'}}, }; var CHOICES={ ['CHECK ON '+(PARAMS.f ?'HER' :'HIM')] : 'v0Ambush', ['IGNORE ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Leave', ['ATTACK ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Attack', }; var PARAMS={}; PARAMS.eLast='vRapey'; return out+setup.ENCOUNTERS[_encounter].CHOICES.whatDoYouDo(CHOICES, HINTS, PARAMS); }, 'vArrogant' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=' their arrogance is appalling... '; switch(PARAMS.eLast) { case 'v1Encounter': out+=''; break; default: out+=''; break; } /* hints unlocked... HINTS? */ var HINTS={ 'HINT 1': {'choice':'hint1', 'PARAMS':{'hotkey':'Q'}}, }; var CHOICES={ ['CHECK ON '+(PARAMS.f ?'HER' :'HIM')] : 'v0Ambush', ['IGNORE ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Leave', ['ATTACK ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Attack', }; var PARAMS={}; PARAMS.eLast='vArrogant'; return out+setup.ENCOUNTERS[_encounter].CHOICES.whatDoYouDo(CHOICES, HINTS, PARAMS); }, 'vTrees' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=' you hear rustling in the branches above... '; switch(PARAMS.eLast) { case 'v1Distant': out+=''; break; default: out+=''; break; } /* hints unlocked... HINTS? */ var HINTS={ 'HINT 1': {'choice':'hint1', 'PARAMS':{'hotkey':'Q'}}, }; var CHOICES={ 'CONTINUE': 'v0Ambush', }; var PARAMS={}; PARAMS.eLast='vTrees'; return out+setup.ENCOUNTERS[_encounter].CHOICES.whatDoYouDo(CHOICES, HINTS, PARAMS); }, 'vScreams' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=' sounds like a '+(PARAMS.f ?'woman' :'man')+' screaming... '; switch(PARAMS.eLast) { case 'v1Distant': out+=''; break; default: out+=''; break; } /* hints unlocked... HINTS? */ var HINTS={ 'HINT 1': {'choice':'hint1', 'PARAMS':{'hotkey':'Q'}}, }; var CHOICES={ 'CHECK IT OUT' : 'v0Ambush', 'IGNORE IT' : 'v0Leave', }; var PARAMS={}; PARAMS.eLast='vScreams'; return out+setup.ENCOUNTERS[_encounter].CHOICES.whatDoYouDo(CHOICES, HINTS, PARAMS); }, 'vMistyShadow' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=' you see a shadowy figure in the mist... '; switch(PARAMS.eLast) { case 'v1Distant': out+=''; break; default: out+=''; break; } /* hints unlocked... HINTS? */ var HINTS={ 'HINT 1': {'choice':'hint1', 'PARAMS':{'hotkey':'Q'}}, }; var CHOICES={ 'CHECK IT OUT' : 'v0Ambush', 'IGNORE IT' : 'v0Leave', }; var PARAMS={}; PARAMS.eLast='vMistyShadow'; return out+setup.ENCOUNTERS[_encounter].CHOICES.whatDoYouDo(CHOICES, HINTS, PARAMS); }, 'vSiren' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=' you hear a beautiful melody on the wind, a sad and lonely song in a powerful '+(PARAMS.f ?'female' :'male')+' voice... '; switch(PARAMS.eLast) { case 'v1Distant': out+=''; break; default: out+=''; break; } /* hints unlocked... HINTS? */ var HINTS={ 'HINT 1': {'choice':'hint1', 'PARAMS':{'hotkey':'Q'}}, }; var CHOICES={ 'CHECK IT OUT' : 'v0Ambush', 'IGNORE IT' : 'v0Leave', }; var PARAMS={}; PARAMS.eLast='vSiren'; return out+setup.ENCOUNTERS[_encounter].CHOICES.whatDoYouDo(CHOICES, HINTS, PARAMS); }, 'vShy' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=' '+(PARAMS.f ?'she' :'he')+' seems nervous, unable to hold eye contact or form sentances -under different circumstances it would be cute... '; switch(PARAMS.eLast) { case 'v1Following': out+=''; break; default: out+=''; break; } /* hints unlocked... HINTS? */ var HINTS={ 'HINT 1': {'choice':'hint1', 'PARAMS':{'hotkey':'Q'}}, }; var CHOICES={ ['CHECK ON '+(PARAMS.f ?'HER' :'HIM')] : 'v0Ambush', ['IGNORE ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Leave', ['ATTACK ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Attack', }; var PARAMS={}; PARAMS.eLast='vShy'; return out+setup.ENCOUNTERS[_encounter].CHOICES.whatDoYouDo(CHOICES, HINTS, PARAMS); }, 'vCreepy' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=' '+(PARAMS.f ?'she' :'he')+' seems way too interested in your chest -or, is that your neck '+(PARAMS.f ?'she' :'he')+''s staring at... '; switch(PARAMS.eLast) { case 'v1Following': out+=''; break; default: out+=''; break; } /* hints unlocked... HINTS? */ var HINTS={ 'HINT 1': {'choice':'hint1', 'PARAMS':{'hotkey':'Q'}}, }; var CHOICES={ ['CHECK ON '+(PARAMS.f ?'HER' :'HIM')] : 'v0Ambush', ['IGNORE ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Leave', ['ATTACK ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Attack', }; var PARAMS={}; PARAMS.eLast='vCreepy'; return out+setup.ENCOUNTERS[_encounter].CHOICES.whatDoYouDo(CHOICES, HINTS, PARAMS); }, 'vHungry' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=' '+(PARAMS.f ?'she' :'he')+' flashes '+(PARAMS.f ?'her' :'his')+' fangs and lunges for you... '; switch(PARAMS.eLast) { /* case 'v1Encounter': out+=''; break; */ default: out+=''; break; } /* hints unlocked... HINTS? */ var HINTS={ 'HINT 1': {'choice':'hint1', 'PARAMS':{'hotkey':'Q'}}, }; var CHOICES={ ['TALK TO ' +(PARAMS.f ?'HER' :'HIM') ] : 'v0Ambush', ['RUN... ' ] : 'v0Escape', ['ATTACK ' +(PARAMS.f ?'HER' :'HIM') ] : 'v0Attack', }; var PARAMS={}; PARAMS.eLast='vHungry'; return out+setup.ENCOUNTERS[_encounter].CHOICES.whatDoYouDo(CHOICES, HINTS, PARAMS); }, 'vAngry' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=' '+(PARAMS.f ?'she' :'he')+' flashes '+(PARAMS.f ?'her' :'his')+' fangs and lunges for you... '; switch(PARAMS.eLast) { case 'v1Encounter': out+=''; break; default: out+=''; break; } /* hints unlocked... HINTS? */ var HINTS={ 'HINT 1': {'choice':'hint1', 'PARAMS':{'hotkey':'Q'}}, }; var CHOICES={ ['TALK TO ' +(PARAMS.f ?'HER' :'HIM') ] : 'v0Ambush', ['RUN... ' ] : 'v0Escape', ['ATTACK ' +(PARAMS.f ?'HER' :'HIM') ] : 'v0Attack', }; var PARAMS={}; PARAMS.eLast='vAngry'; return out+setup.ENCOUNTERS[_encounter].CHOICES.whatDoYouDo(CHOICES, HINTS, PARAMS); }, 'vPlayful' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=' '+(PARAMS.f ?'she' :'he')+' offers to give you a head start... '; switch(PARAMS.eLast) { case 'v1Encounter': out+=''; break; default: out+=''; break; } /* hints unlocked... HINTS? */ var HINTS={ 'HINT 1': {'choice':'hint1', 'PARAMS':{'hotkey':'Q'}}, }; var CHOICES={ ['TALK TO ' +(PARAMS.f ?'HER' :'HIM') ] : 'v0Ambush', ['RUN... ' ] : 'v0Escape', ['ATTACK ' +(PARAMS.f ?'HER' :'HIM') ] : 'v0Attack', }; var PARAMS={}; PARAMS.eLast='vPlayful'; return out+setup.ENCOUNTERS[_encounter].CHOICES.whatDoYouDo(CHOICES, HINTS, PARAMS); }, 'vConverse' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=' seems like '+(PARAMS.f ?'she' :'he')+' just wants to talk... '; switch(PARAMS.eLast) { case 'v1Encounter': out+=''; break; default: out+=''; break; } /* TODO: USE A LOOP INSTEAD OF RECURSION FOR CONVERSATION... */ /* ?additional nodes to set PARAMS.topic? */ /* alt: redesign detail & choices functions to accept special PARAMS for callback */ /* ...not a simple prospect, as it means passing a javacsript Object through a print-macro */ /* hints unlocked... HINTS? */ var HINTS={ 'HINT 1': {'choice':'hint1', 'PARAMS':{'hotkey':'Q'}}, }; var CHOICES={ ['INDULGE '+(PARAMS.f ?'HER' :'HIM')] : 'v0Ambush', ['IGNORE ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Leave', ['ATTACK ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Attack', }; var PARAMS={}; PARAMS.eLast='vConverse'; return out+setup.ENCOUNTERS[_encounter].CHOICES.whatDoYouDo(CHOICES, HINTS, PARAMS); }, 'vFlirt' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=' you find '+(PARAMS.f ?'her' :'him')+' so incredibly alluring, that you didn't even realize that '+(PARAMS.f ?'she' :'he')+''s been caressing your skin and fondling you this whole time... '; switch(PARAMS.eLast) { case 'v1Encounter': out+=''; break; case 'v1Distress': out+=''; break; default: out+=''; break; } /* hints unlocked... HINTS? */ var HINTS={ 'HINT 1': {'choice':'hint1', 'PARAMS':{'hotkey':'Q'}}, }; var CHOICES={ ['CHECK ON '+(PARAMS.f ?'HER' :'HIM')] : 'v0Ambush', ['IGNORE ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Leave', ['ATTACK ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Attack', }; var PARAMS={}; PARAMS.eLast='vFlirt'; return out+setup.ENCOUNTERS[_encounter].CHOICES.whatDoYouDo(CHOICES, HINTS, PARAMS); }, 'vGlamour' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=' you swear you know '+(PARAMS.f ?'her' :'him')+'- '+(PARAMS.f ?'she' :'he')+' looks just like that '+(PARAMS.f ?'girl' :'boy')+' you had a crush on in school... '; switch(PARAMS.eLast) { case 'v1Encounter': out+=''; break; default: out+=''; break; } /* hints unlocked... HINTS? */ var HINTS={ 'HINT 1': {'choice':'hint1', 'PARAMS':{'hotkey':'Q'}}, }; var CHOICES={ ['CHECK ON '+(PARAMS.f ?'HER' :'HIM')] : 'v0Ambush', ['IGNORE ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Leave', ['ATTACK ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Attack', }; var PARAMS={}; PARAMS.eLast='vGlamour'; return out+setup.ENCOUNTERS[_encounter].CHOICES.whatDoYouDo(CHOICES, HINTS, PARAMS); }, 'vEnthrall' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=' '+(PARAMS.f ? 'her' : 'his')+' gaze is hypnotic, you feel your mind being drawn deeper into those dark eyes... you're not even sure what '+(PARAMS.f ? 'she' : 'he')+''s saying, but you know somehow it's right, and you will gladly do it... '; switch(PARAMS.eLast) { case 'v1Following': out+=''; break; case 'v1Encounter': out+=''; break; default: out+=''; break; } PARAMS.eLast='vEnthrall'; /* hints unlocked... HINTS? */ var HINTS={ 'HINT 1': {'choice':'hint1', 'PARAMS':{'hotkey':'Q'}}, }; var CHOICES={ ['...MUST ...RESIST ...' +(PARAMS.f ?'HER' :'HIM')] : 'v0Ambush', ['GIVE IN TO ' +(PARAMS.f ?'HER' :'HIM')] : 'vImagination', ['ATTACK ' +(PARAMS.f ?'HER' :'HIM')] : 'v0Attack', }; var PARAMS={}; PARAMS.eLast='vEnthrall'; return out+setup.ENCOUNTERS[_encounter].CHOICES.whatDoYouDo(CHOICES, HINTS, PARAMS); }, 'vImagination' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=' you realize it was just your imagination... '; switch(PARAMS.eLast) { case 'v2FoundBody': out+=''; break; case 'v1WTF': out+=''; break; case 'v1Following': out+=''; break; case 'v1Distant': out+=''; break; default: out+=''; break; } PARAMS.eLast='vImagination'; /* random illusion, x/(13-tries) - max 13, average ~5 */ /* hints unlocked... HINTS? */ var HINTS={ 'HINT 1': {'choice':'hint1', 'PARAMS':{'hotkey':'Q'}}, }; var CHOICES={ 'CONTINUE' : 'v0Leave', }; var PARAMS={}; PARAMS.eLast='vImagination'; return out+setup.ENCOUNTERS[_encounter].CHOICES.whatDoYouDo(CHOICES, HINTS, PARAMS); }, 'vAreReal' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out='is that a... oh fuck, they're real... vampires are fucking real!'; switch(PARAMS.eLast) { case 'v1WTF': out+=''; break; default: out+=''; break; } /* hints unlocked... HINTS? */ var HINTS={ 'HINT 1': {'choice':'hint1', 'PARAMS':{'hotkey':'Q'}}, }; var CHOICES={ 'CONTINUE' : 'v0Ambush', }; var PARAMS={}; PARAMS.eLast='vAreReal'; return out+setup.ENCOUNTERS[_encounter].CHOICES.whatDoYouDo(CHOICES, HINTS, PARAMS); }, /* baseline varaitions: */ 'v1WTF' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ PARAMS.vWeird = setup.ALIAS.worldVarAdd('park.mystery.progress', 1); var out=either( 'You saw something out of the corner of your eye... it was fast- like a blur... ', 'You hear a strange sound coming from the trees... ', 'Suddenly this feeling of dread washes over you... ', 'You feel a chill run up your spine... ', 'What the fuck was that, you jump as you feel something brush across your shoulder... ', 'They're watching... you can feel their wicked gaze upon you... ', 'You sense a powerful presence nearby... ', 'As you wander about, an eerie fog rolls in... ', 'Your mind grows hazy, unable to focus you wander aimlessly... ', 'Eyes. You saw them... where'd they go? Whose eyes? What the fuck is going on? ' ); switch(PARAMS.eLast) { case 'xxxx': out+=''; break; default: out+=''; break; } /* variations: saw something heard something felt something chill ...? */ PARAMS.eLast='v1WTF'; var sub_encounter = (Math.random()<PARAMS.vWeird/13 ? 'vAreReal' : 'vImagination'); setup.ALIAS.debugLog('[sub-encounter: '+sub_encounter+']'); return out+setup.ENCOUNTERS[_encounter].CHOICES[sub_encounter](PARAMS); }, 'v1Following' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=either( 'You have this eerie feeling you're being watched, you quickly turn around to find... ', 'You hear a twig snap mere inches behind- you flip 'round to see ', 'You tense as an icy breath hits the back of your neck... ' ); switch(PARAMS.eLast) { case 'xxxx': out+=''; break; default: out+=''; break; } var VARIATIONS={ 'vShy' : 100*(PARAMS.f ?3 :1), 'vCreepy' : 100*(PARAMS.f ?1 :3), 'v0Ambush' : 100*(PARAMS.f ?1 :1), 'vEnthrall' : 100*(PARAMS.f ?1 :1), 'vImagination' : 100*(PARAMS.seen ?0.03 : 30), }; PARAMS.eLast='v1Following'; var sub_encounter = setup.ALIAS.spinTheWheel(VARIATIONS); setup.ALIAS.debugLog('[sub-encounter: '+sub_encounter+']'); return out+setup.ENCOUNTERS[_encounter].CHOICES[sub_encounter](PARAMS); }, 'v1Distant' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out='In the distance, '; switch(PARAMS.eLast) { case 'xxxx': out+=''; break; default: out+=''; break; } var VARIATIONS={ 'vSiren' : 100*(PARAMS.f ?10 : 0.1), 'vMistyShadow' : 100*(PARAMS.f ?10 : 1), 'vScreams' : 100*(PARAMS.f ?3 : 1), 'vTrees' : 100*(PARAMS.f ?1 : 1), 'vImagination' : 100*(PARAMS.seen ?0.03 : 30), }; PARAMS.eLast='v1Distant'; var sub_encounter = setup.ALIAS.spinTheWheel(VARIATIONS); setup.ALIAS.debugLog('[sub-encounter: '+sub_encounter+']'); return out+setup.ENCOUNTERS[_encounter].CHOICES[sub_encounter](PARAMS); }, 'v1Encounter' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out='A strange '+(PARAMS.f ? 'woman' : 'man')+' comes up to you... '; switch(PARAMS.eLast) { case 'xxxx': out+=''; break; default: out+=''; break; } var VARIATIONS={ 'vFlirt' : 100*(PARAMS.f ?3 :1), 'vRapey' : 100*(PARAMS.f ?1 :3), 'vConverse' : 100*(PARAMS.f ?3 :1), 'vArrogant' : 100*(PARAMS.f ?1 :3), 'vPlayful' : 100*(PARAMS.f ?3 :1), 'vEnthrall' : 100*(PARAMS.f ?1 :1), 'vGlamour' : 100*(PARAMS.f ?1 :1), 'vAngry' : 100*(PARAMS.f ?1 :3), }; PARAMS.eLast='v1Encounter'; var sub_encounter = setup.ALIAS.spinTheWheel(VARIATIONS); setup.ALIAS.debugLog('[sub-encounter: '+sub_encounter+']'); return out+setup.ENCOUNTERS[_encounter].CHOICES[sub_encounter](PARAMS); }, 'v1Corpse' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out='You see what looks like a body... '; switch(PARAMS.eLast) { case 'xxxx': out+=''; break; default: out+=''; break; } var VARIATIONS={ 'vLurking' : 100*(PARAMS.f ?1 :1), 'vTorpor' : 100*(PARAMS.f ?1 :1)*(PARAMS.dead ? 100 : 0.01), 'vPossum' : 100*(PARAMS.f ?1 :1), 'v2FoundBody' : 100*(PARAMS.f ?1 :1)*(PARAMS.dead ? 60 : 0.6), }; PARAMS.eLast='v1Corpse'; var sub_encounter = setup.ALIAS.spinTheWheel(VARIATIONS); setup.ALIAS.debugLog('[sub-encounter: '+sub_encounter+']'); return out+setup.ENCOUNTERS[_encounter].CHOICES[sub_encounter](PARAMS); }, 'v1Distress' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out='You hear someone in trouble... '; switch(PARAMS.eLast) { case 'xxxx': out+=''; break; default: out+=''; break; } var VARIATIONS={ 'vHelpMe' : 100*(PARAMS.f ?3 :1), 'vInjured' : 100*(PARAMS.f ?1 :1), 'vRunning' : 100*(PARAMS.f ?1 :3), 'vFlirt' : 100*(PARAMS.f ?3 :1), 'vRapey' : 100*(PARAMS.f ?1 :3), }; PARAMS.eLast='v1Distress'; var sub_encounter = setup.ALIAS.spinTheWheel(VARIATIONS); setup.ALIAS.debugLog('[sub-encounter: '+sub_encounter+']'); return out+setup.ENCOUNTERS[_encounter].CHOICES[sub_encounter](PARAMS); }, 'v1Prone' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out='You see what looks like a body... '; switch(PARAMS.eLast) { case 'xxxx': out+=''; break; default: out+=''; break; } var VARIATIONS={ 'vInjured' : 100*(PARAMS.f ?3 :1), 'vDrunk' : 100*(PARAMS.f ?1 :3), 'v2FoundBody' : 100*(PARAMS.f ?1 :1)*(PARAMS.dead ? 60 : 0.6), }; PARAMS.eLast='v1Prone'; var sub_encounter = setup.ALIAS.spinTheWheel(VARIATIONS); setup.ALIAS.debugLog('[sub-encounter: '+sub_encounter+']'); return out+setup.ENCOUNTERS[_encounter].CHOICES[sub_encounter](PARAMS); }, /* READY TO GO: */ 'v0Leave' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=' you decide it's none of your business... '; switch(PARAMS.eLast) { case 'xxxx': out+=''; break; default: out+=''; break; } PARAMS.eLast='v0Leave'; setup.ALIAS.showSideBar(); return out+setup.ALIAS.reloadPassage(); }, 'v0Escape' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=' you manage to get away... '; switch(PARAMS.eLast) { case 'xxxx': out+=''; break; default: out+=''; break; } PARAMS.eLast='v0Escape'; setup.ALIAS.showSideBar(PARAMS); return out+setup.PASSAGES[$G.PC.STATE.lastPassage].exit(); }, 'v0Ambush' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=' '+(PARAMS.f ?'she' :'he')+' attacks...'; switch(PARAMS.eLast) { case 'xxxx': out+=''; break; default: out+=''; break; } PARAMS.eLast='v0Ambush'; return out+setup.ENCOUNTERS[_encounter].CHOICES['v0Fight'](PARAMS); }, 'v0Attack' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='|') */ var out=' You lunge at '+(PARAMS ?'her' :'him')+' ... '; switch(PARAMS.eLast) { case 'xxxx': out+=''; break; default: out+=''; break; } PARAMS.eLast='v0Attack'; return out+setup.ENCOUNTERS[_encounter].CHOICES['v0Fight'](PARAMS); }, 'v0Fight' : function(PARAMS) { PARAMS=PARAMS||_ENC_PARAMS||{}; /* (PARAMS.eLast=='v0Ambush|v0Attack|whatDoYouDo') */ setup.ALIAS.worldVarAdd('seen.vampire', 1); return setup.ENCOUNTERS['vampire-combat'].replacePassage(); }, }, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { var sX=setup.ALIAS; var vSeen = sX.worldVarGet('seen.vampire'); var vWeird = sX.worldVarGet('park.mystery.progress'); var vRate = (vSeen ?10.0 :0.1); var S2=sX.statGet('all', 'current', _P2); var dead=_P2.dead; var PARAMS={ 'seen' : vSeen, 'f' : ('she'===sX.he_she(_P2.TRAITS.gender)), 'age' : _P2.METRICS.age, 'STATS' : S2, 'dead' : dead, 'vSeen' : vSeen, 'vWeird' : vWeird, 'eLast' : 'start', }; var VARIATIONS={ 'v1Following' : 100*vRate, 'v0Ambush' : 100*vRate, 'v1Prone' : 100*vRate*(dead ? 60 : 0.6), 'v1Distress' : 100*vRate, 'v1Corpse' : 100*vRate*(dead ? 60 : 0.6), 'v1Encounter' : 100*vRate, 'v1Distant' : 100*vRate, 'v1WTF' : 100/(vRate**1.5), }; var sub_encounter = sX.spinTheWheel(VARIATIONS); sX.debugLog('[sub-encounter: '+sub_encounter+']'); /* experimenting with a more compact sub-encounter system using the CHOICES branches instead of full encounters... */ return '<div>'+ setup.ENCOUNTERS[_encounter].CHOICES[sub_encounter](PARAMS) +'</div>'; }, 'afterPassage' : function() { return ''; }, }, 'vampire-combat':{ 'setup' : function() { var sX=setup.ALIAS; var P2=sX.generateCreature('species.vampire'); P2.actor='cpu-mob'; sX.combat_loadP2(P2); setup.ENCOUNTERS.combat.setup(); return ''; }, 'replace' : true, 'overrideExit' : true, 'hideMenu' : false, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return setup.ENCOUNTERS['combat'].replacePassage(); }, 'afterPassage' : function() { return setup.ENCOUNTERS['combat'].afterPassage(); }, }, 'nymph':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'CHOICES' :{ 'whatDoYouDo' : function() { var choices = ''; choices += setup.ALIAS.enc_moreDetail('WHAT IS CHOICE 1', "choice1", _encounter, {'hotkey':'Q'}); choices += setup.ALIAS.enc_showChoices({ 'CHOICE 1' : "choice1", }, _encounter ); return choices; }, 'choice1' : function() { var out='ya had ta pick #1'; return out + setup.PASSAGES[$G.PC.STATE.lastPassage].exit(); }, }, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'succubus':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'CHOICES' :{ 'whatDoYouDo' : function() { var choices = ''; choices += setup.ALIAS.enc_moreDetail('WHAT IS CHOICE 1', "choice1", _encounter, {'hotkey':'Q'}); choices += setup.ALIAS.enc_showChoices({ 'CHOICE 1' : "choice1", }, _encounter ); return choices; }, 'choice1' : function() { var out='ya had ta pick #1'; return out + setup.PASSAGES[$G.PC.STATE.lastPassage].exit(); }, }, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'litter':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'CHOICES' :{ 'whatDoYouDo' : function() { var choices = ''; choices += setup.ALIAS.enc_moreDetail('WHAT IS CHOICE 1', "choice1", _encounter, {'hotkey':'Q'}); choices += setup.ALIAS.enc_showChoices({ 'CHOICE 1' : "choice1", }, _encounter ); return choices; }, 'choice1' : function() { var out='ya had ta pick #1'; return out + setup.PASSAGES[$G.PC.STATE.lastPassage].exit(); }, }, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, /* random rift... may spawn demon, or portal elsewhere... */ 'rift':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'CHOICES' :{ 'whatDoYouDo' : function() { var choices = ''; choices += setup.ALIAS.enc_moreDetail('WHAT IS CHOICE 1', "choice1", _encounter, {'hotkey':'Q'}); choices += setup.ALIAS.enc_showChoices({ 'CHOICE 1' : "choice1", }, _encounter ); return choices; }, 'choice1' : function() { var out='ya had ta pick #1'; return out + setup.PASSAGES[$G.PC.STATE.lastPassage].exit(); }, }, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, /* random demon... */ 'demon':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'CHOICES' :{ 'whatDoYouDo' : function() { var choices = ''; choices += setup.ALIAS.enc_moreDetail('WHAT IS CHOICE 1', "choice1", _encounter, {'hotkey':'Q'}); choices += setup.ALIAS.enc_showChoices({ 'CHOICE 1' : "choice1", }, _encounter ); return choices; }, 'choice1' : function() { var out='ya had ta pick #1'; return out + setup.PASSAGES[$G.PC.STATE.lastPassage].exit(); }, }, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, /* random cave... may contain rift, demon, etc. */ 'cave':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'CHOICES' :{ 'whatDoYouDo' : function() { var choices = ''; choices += setup.ALIAS.enc_moreDetail('WHAT IS CHOICE 1', "choice1", _encounter, {'hotkey':'Q'}); choices += setup.ALIAS.enc_showChoices({ 'CHOICE 1' : "choice1", }, _encounter ); return choices; }, 'choice1' : function() { var out='ya had ta pick #1'; return out + setup.PASSAGES[$G.PC.STATE.lastPassage].exit(); }, }, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, 'parkhaven':{ 'setup' : function() { return ''; }, 'replace' : true, 'overrideExit' : true, 'hideMenu' : false, 'CHOICES' :{ 'whatDoYouDo' : function() { var choices = ''; choices += setup.ALIAS.enc_showChoices({ 'INVESTIGATE' : "investigate", 'LEAVE' : "leave", }, _encounter ); return choices; }, 'leave' : function() { var out=''; return out + setup.PASSAGES[$G.PC.STATE.lastPassage].exit(); }, 'investigate' : function() { var out='<p>There's a mural painted along the fence that reads, "Parkhaven Newage Bookstore", which seems to indicate the front entrance.</p>'; setup.ALIAS.location_discover('PARKHAVEN'); out += setup.ALIAS.enc_showChoices({ 'GO INSIDE' : "go inside", 'LEAVE' : "leave", }, _encounter ); return out; }, 'go inside' : function() { var out="<<goto 'PARKHAVEN'>>"; return out; }, }, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { var out = "<p>You come across an old house on the edge of the park... it appears to have been added on to several times over the years, and something about it feels very odd.</p>"; return out+'<div>'+ setup.ENCOUNTERS[_encounter].CHOICES.whatDoYouDo() +'</div>'; }, 'afterPassage' : function() { return ''; }, }, /* xxxx */ 'ENCOUNTER TEMPLATE':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'CHOICES' :{ 'whatDoYouDo' : function() { var choices = ''; choices += setup.ALIAS.enc_moreDetail('WHAT IS CHOICE 1', "choice1", _encounter, {'hotkey':'Q'}); choices += setup.ALIAS.enc_showChoices({ 'CHOICE 1' : "choice1", }, _encounter ); return choices; }, 'choice1' : function() { var out='ya had ta pick #1'; return out + setup.PASSAGES[$G.PC.STATE.lastPassage].exit(); }, }, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, /* END xxxx */ /* xxxx */ 'NAVIGATION':{ 'setup' : function() { return ''; }, 'replace' : false, 'overrideExit' : false, 'hideMenu' : false, 'CHOICES' :{ 'known_places' : function() { return setup.ALIAS.enc_showChoices(setup.ALIAS.navMenu(), 'NAVIGATION' ); }, 'S-MART' : function() { return "<<goto 'S-MART'>>"; }, 'GYM' : function() { return "<<goto 'GYM'>>"; }, 'RIVERSIDE PARK' : function() { return "<<goto 'RIVERSIDE PARK'>>"; }, 'RIVERVALLEY HIGH' : function() { return "<<goto 'RIVERVALLEY HIGH'>>"; }, 'MOTEL' : function() { return "<<goto 'MOTEL'>>"; }, 'DINER' : function() { return "<<goto 'DINER'>>"; }, 'GAS STATION' : function() { return "<<goto 'GAS STATION'>>"; }, 'PARKHAVEN' : function() { return "<<goto 'PARKHAVEN'>>"; }, 'PRISON' : function() { return "<<goto 'PRISON'>>"; }, }, 'beforePassage' : function() { return ''; }, 'replacePassage' : function() { return ''; }, 'afterPassage' : function() { return ''; }, }, /* END xxxx */ }>>
<<set _time=setup.ALIAS.getTime('24'); >> <<replace '#datetime'>><<include 'DATETIME'>><</replace>> <<if (_time>'08:59')&&(_time<'17:00') >> <<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> NORMAL PASSAGE <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>> ADD PASSAGE EXIT TO setup PASSAGES <<else>> <<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <p>You see a sign that reads, "SORRY, WE'RE CLOSED RIGHT NOW. PLEASE COME BACK AFTER 07:00 AM".</p> <p>What do you do?</p> <div><<print setup.ALIAS.exitPassage();>></div> <</if>> <</if>>
<h2><<print setup.AISLES[_dept].name>></h2> <h3><<print setup.AISLES[_dept].desc>></h3> <<for _aisle_id, _data range setup.AISLES[_dept].AISLES>> <<if (_aisle == _aisle_id)>> <<include 'LIST ITEMS FOR AISLE'>> <<else>> <p class='narrow'><<print " <<link '" + _data.name + "'>> <<set _aisle to '" + _aisle_id + "'>> <<replace '#passages'>><<include '"+ State.passage +"'>><</replace>> <</link>> ">></p> <</if>> <</for>>
<<run { var sX=setup.ALIAS; var sDO=setup.DATA.OPTIONS; sX.buildVersion='supporter'; sDO.difficultyLevels = { 'BirthRight' :{ 'label':'BirthRight', 'level': 0.16, 'build_lv':'supporter', }, 'EasyLife' :{ 'label':'EasyLife', 'level': 0.42, 'build_lv':'public', }, 'NormalLife' :{ 'label':'NormalLife', 'level': 1.00, 'build_lv':'public', }, 'RoughLife' :{ 'label':'RoughLife', 'level': 1.69, 'build_lv':'public', }, 'HardLife' :{ 'label':'HardLife', 'level': 3.16, 'build_lv':'public', }, 'BadLife' :{ 'label':'BadLife', 'level': 6.00, 'build_lv':'public', }, 'SurvivalMode' :{ 'label':'SurvivalMode', 'level': 10.00, 'build_lv':'supporter', }, }; /* STATUS UPDATE HOOKS FOR CHEAT CODES */ sX.before_update = function(CHAR){ var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('getResource - NO CHAR!'); } /* sX.statGet(stat, secAlias, CHAR); */ var S = sX.statGet('all', 'current', CHAR); var M = $G.PC.MATRIX; var B = $G.PC.BODY; /* Valkyrie Mode Cheat */ if((CHAR.MATRIX===$G.PC.MATRIX) && settings.valkyrieMode) { M.vigor = Math.max(M.vigor, (S.STR + S.PHY) ); M.train = Math.max(M.train, (S.STR + S.WSD) ); M.tough = Math.max(M.tough, (S.STR + S.END) ); M.power = Math.max(M.power, (S.STR + S.SPD) ); M.skill = Math.max(M.skill, (S.STR + S.INS) ); M.aware = Math.max(M.aware, (S.PHY + S.WSD) ); M.vital = Math.max(M.vital, (S.PHY + S.END) ); M.metab = Math.max(M.metab, (S.PHY + S.SPD) ); M.focus = Math.max(M.focus, (S.PHY + S.INS) ); M.guard = Math.max(M.guard, (S.WSD + S.END) ); M.react = Math.max(M.react, (S.WSD + S.SPD) ); M.psych = Math.max(M.psych, (S.WSD + S.INS) ); M.regen = Math.max(M.regen, (S.END + S.SPD) ); M.force = Math.max(M.force, (S.END + S.INS) ); M.fight = Math.max(M.fight, (S.SPD + S.INS) ); Object.keys(B).forEach(function(part) { B[part].train+=B[part].damage; B[part].damage=0; B[part].fatigue=0; B[part].condition=B[part].train*S.capacity; }); } /* Amazon Mode Cheat - buff, PC only */ if((CHAR.MATRIX===$G.PC.MATRIX)) { var they = sX.he_she(CHAR.gender||CHAR.TRAITS.gender); var Cap = S.caliber+S.magnitude; var BASE_STATS = ['STR','PHY','WSD','END','SPD','INS']; var azVal = $G.WORLD.amazonIndex; var azBuff = (('she'==they) ? azVal : -sX.sqrt(azVal, '+')); BASE_STATS.forEach(function(stat) { $G.PC.S[stat]['TEMP']['amazonMode'] = { 'amt': sX.forceInRange(-Cap, (settings.amazonMode ? azBuff : 0), Cap), 'exp': null, }; }); } }; sX.after_update = function(CHAR){ var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('getResource - NO CHAR!'); } /* sX.statGet(stat, secAlias, CHAR); */ var S = sX.statGet('all', 'current', CHAR); /* Guru Mode Cheat */ if(settings.guruMode) { $G.PC.MATRIX.light = Math.max($G.PC.MATRIX.light, S.light_well); } /* Oni Mode Cheat */ if(settings.oniMode) { $G.PC.MATRIX.dark = Math.max($G.PC.MATRIX.dark, S.dark_well); } /* Valkyries and Goddesses are immortal */ if(settings.valkyrieMode || settings.goddessMode) { $G.PC.dead = false; delete $G.PC.CoD; } else if($G.PC.dead) { $('#passages').wiki("<<goto 'GAME OVER'>>"); } /* Amazon Mode Cheat */ if(settings.amazonMode) { $G.WORLD.amazonIndex=($G.WORLD.girlPower/10)*10; } }; sX.sale_price = function(cost, discount) { /* Banker Mode Cheat */ return (settings.bankerMode ? 0 : cost*(1-discount)); }, sX.before_use = function(item_id, qty, CHAR){}; sX.after_use = function(item_id, qty, CHAR){ var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('getResource - NO CHAR!'); } /* Artisan Mode Cheat- replenish use */ if(settings.artisanMode) { CHAR.STUFF[item_id]+=qty; /* Alchemist Mode Cheat- undo overuse */ } else if(settings.alchemistMode) { CHAR.STUFF[item_id]+=qty*9/10; } }; sX.powers_hasPowerUnlocked = function(power, CHAR) { return ( ((CHAR.MATRIX===$G.PC.MATRIX) && settings.goddessMode) ? true : CHAR.POWERS[power] ); }; sX.powers_getPowerRank = function(power, CHAR) { var sX=setup.ALIAS; return ( ((CHAR.MATRIX===$G.PC.MATRIX) && settings.goddessMode) ? sX.statGet('CALC', 'Cap', CHAR) : ( CHAR.POWERS[power] ? CHAR.POWERS[power].rank : 0 ) ); }; sX.powers_getKnown = function(CHAR) { /* list ALL powers vs Known powers... */ return (settings.goddessMode ? setup.POWERS : CHAR.POWERS ); }; /* put new cheat multipliers here! */ sX.putInBounds = function(value, context, PARAMS) { var sX=setup.ALIAS; if(isNaN(value)) { value=0; } var valid=value; switch(context) { case 'combatStrike-dmg': case 'combatStrike-tuf': case 'combatStrike-stamCost': /* require a positive value! */ valid=Math.max(0, value); break; case 'findChange-min_find': case 'findChange-max_find': case 'findCash-min_find': case 'findCash-max_find': /* Adventurer Mode Cheat */ valid=Math.max(value, 0) * (settings.adventurerMode ? 10 : 1); break; case 'recoverActive-hours': case 'recoverPassive-hours': /* Slacker Mode Cheat */ valid=Math.max(value, 0) * (settings.slackerMode ? 10 : 1); break; case 'doRest-hours': case 'doExplore-hours': case 'doWorkout-hours': case 'doWorkout-level': /* require a positive value! */ valid=Math.max(value, 0); break; case 'trainSTATS-effort': case 'doTrainingMATRIX-units': /* Athlete Mode Cheat */ valid=Math.max(value, 0) * (settings.athleteMode ? 10 : 1); break; case 'useItem-qty': /* Alchemist Mode Cheat */ valid=Math.max(value, 0) * (settings.alchemistMode ? 10 : 1); break; case 'wildSurge_boost-amt': /* Alchemist Mode Cheat */ valid=Math.max(value, 0) * (settings.guruMode ? 10 : 1); break; case 'powerTransfer-amt': /* require a value between 0.0-1.0! */ valid=Math.max(0, Math.min(value * (settings.oniMode ? 10 : 1), 1)); break; case 'doEnergyMATRIX-units': case 'doDamageMATRIX-units': /* no change at this time */ valid=value; break; case 'generateRandomID-age': /* venusMode Mode Cheat */ valid=(settings.venusMode ? Math.round(12+sX.sqrt(valid, '0')) : Math.max(0.1, Math.min(value, 100.0)) ); break; case 'qiFlow-cycles': /* require a value between 0.1-100.0! */ valid=Math.max(0.1, Math.min(value, 100.0)); break; default: valid=value; break; } return valid; }; sX.qiAdd = function(amt, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('qiAdd - NO CHAR!'); } if(settings.valkyrieMode) { if(CHAR.MATRIX===$G.PC.MATRIX) { amt=Math.abs(amt); } sX.before_update($G.PC); } CHAR.MATRIX.tough += amt/15; CHAR.MATRIX.power += amt/15; CHAR.MATRIX.vigor += amt/15; CHAR.MATRIX.skill += amt/15; CHAR.MATRIX.train += amt/15; CHAR.MATRIX.regen += amt/15; CHAR.MATRIX.vital += amt/15; CHAR.MATRIX.force += amt/15; CHAR.MATRIX.guard += amt/15; CHAR.MATRIX.metab += amt/15; CHAR.MATRIX.fight += amt/15; CHAR.MATRIX.react += amt/15; CHAR.MATRIX.focus += amt/15; CHAR.MATRIX.aware += amt/15; CHAR.MATRIX.psych += amt/15; }; sX.spinTheWheel = function(ODDS) { var sX=setup.ALIAS; var total = 0; var spin = Math.random(); var WHEEL = {}; var wedge = 0; Object.keys(ODDS).forEach(function(name) { /* is it a static or dynamic rate? */ wedge=sX.getDynamic(ODDS[name]); if(wedge>0) { if(settings.luckMode) { if(name=='nothing') { wedge/=10; } wedge = Math.round((1/wedge) *10000); } total+=wedge; WHEEL[total]=name; } }); spin=Math.round(spin*total); /* find the spin in the wheel... */ return WHEEL[Object.keys(WHEEL).find(function(ticks) { return ticks>=spin; })]; }; sX.setEncounter = function(encounter) { /* Do Not Disturb Mode CHEAT */ return (settings.dndMode ? 'nothing' : encounter); }; Setting.addToggle('debugModeInfo',{ 'label':"Debug Messages - shows additional game-state information in some passages", 'default':false, }); Setting.addHeader('CHEATS MENU', "supporter cheat toggles"); Setting.addToggle('amazonMode' ,{ 'label':"Amazon Mode - begin the apocalypse early by magnifying the index tenfold." , 'default':false, }); Setting.addToggle('adventurerMode' ,{ 'label':"Adventurer Mode - Search yields greatly enhanced." , 'default':false, }); Setting.addToggle('alchemistMode' ,{ 'label':"Alchemist Mode - Item effects greatly enhanced." , 'default':false, }); Setting.addToggle('artisanMode' ,{ 'label':"Artisan Mode - Item use-count never depeltes." , 'default':false, }); Setting.addToggle('athleteMode' ,{ 'label':"Athlete Mode - Exercise gains greatly enhanced." , 'default':false, }); Setting.addToggle('bankerMode' ,{ 'label':"Banker Mode - Buy without actually paying." , 'default':false, }); Setting.addToggle('dndMode' ,{ 'label':"DND Mode - Do what you want, without interruptions. (disables random encounters)" , 'default':false, }); Setting.addToggle('goddessMode' ,{ 'label':"Goddess Mode - All-Powerful. (unlocks all powers)" , 'default':false, }); Setting.addToggle('guruMode' ,{ 'label':"Guru/Zen Mode - Light Karma never drops below full. Healing surges greatly enhanced." , 'default':false, }); Setting.addToggle('luckMode' ,{ 'label':"Luck Mode - Event Rates Reversed." , 'default':false, }); Setting.addToggle('oniMode' ,{ 'label':"Oni/Raaksha Mode - Dark Karma never drops below full. Power drain greatly enhanced." , 'default':false, }); Setting.addToggle('slackerMode' ,{ 'label':"Slacker Mode - Recovery from resting greatly enhanced." , 'default':false, }); Setting.addToggle('valkyrieMode' ,{ 'label':"Valkyrie Mode - Physical Invulnerability and Limitless Energy." , 'default':false, }); Setting.addToggle('venusMode' ,{ 'label':"Venus Mode - Makes everyone young and amorous." , 'default':false, }); Setting.save(); }; >> <<set setup.CHARS['Lisa Irons'] = { '_':{ 'build_lv' : 'supporter', 'girlPower' : 16, }, 'ABOUT':{ 'who_is':'galactic super-soldier', }, 'BODY':{ 'Calves' :{ 'train':60.0, 'damage': 3.42, }, 'Quads' :{ 'train':60.0, 'damage': 3.42, }, 'Hams' :{ 'train':60.0, 'damage': 3.42, }, 'Glutes' :{ 'train':60.0, 'damage': 3.42, }, 'Hips' :{ 'train':60.0, 'damage': 3.42, }, 'LoBack' :{ 'train':60.0, 'damage': 3.42, }, 'Lats' :{ 'train':60.0, 'damage': 3.42, }, 'Traps' :{ 'train':60.0, 'damage': 3.42, }, 'Abs' :{ 'train':60.0, 'damage': 3.42, }, 'Pecs' :{ 'train':60.0, 'damage': 3.42, }, 'Delts' :{ 'train':60.0, 'damage': 3.42, }, 'LeftTri' :{ 'train':60.0, 'damage': 3.42, }, 'RightTri' :{ 'train':60.0, 'damage': 3.42, }, 'LeftBi' :{ 'train':60.0, 'damage': 3.42, }, 'RightBi' :{ 'train':60.0, 'damage': 3.42, }, 'LeftFore' :{ 'train':60.0, 'damage': 3.42, }, 'RightFore' :{ 'train':60.0, 'damage': 3.42, }, 'LeftGrip' :{ 'train':60.0, 'damage': 3.42, }, 'RightGrip' :{ 'train':60.0, 'damage': 3.42, }, 'Cardio' :{ 'train':60.0, 'damage': 3.42, }, 'Kegel' :{ 'train':60.0, 'damage': 3.42, }, 'Brain' :{ 'train':60.0, 'damage': 3.42, }, }, 'DEVICES':{}, 'ENEMIES':{}, 'EQUIP':{ /* SLOT:ID */ /* did not arrive with clothing... or any posessions */ }, 'EXSLAVES':{}, 'FRIENDS':{}, 'JUNK':{}, 'LIMBS':{ 'ARML':{ 'total': 8.0, 'min': 8.0, 'parts': 8.0, 'avg':1.0, 'pct':1.0, }, 'ARMR':{ 'total': 8.0, 'min': 8.0, 'parts': 8.0, 'avg':1.0, 'pct':1.0, }, 'ARMS':{ 'total':12.0, 'min':12.0, 'parts':12.0, 'avg':1.0, 'pct':1.0, }, 'CORE':{ 'total': 5.0, 'min': 5.0, 'parts': 5.0, 'avg':1.0, 'pct':1.0, }, 'LEGL':{ 'total': 6.0, 'min': 6.0, 'parts': 6.0, 'avg':1.0, 'pct':1.0, }, 'LEGR':{ 'total': 6.0, 'min': 6.0, 'parts': 6.0, 'avg':1.0, 'pct':1.0, }, 'LEGS':{ 'total': 6.0, 'min': 6.0, 'parts': 6.0, 'avg':1.0, 'pct':1.0, }, 'SEXX':{ 'total': 7.0, 'min': 7.0, 'parts': 7.0, 'avg':1.0, 'pct':1.0, }, }, 'LOVERS':{}, 'M':{ 'WEIGHT' :{ 'BODY' :{ 'bone' : 34.00, 'fat' : 116.00, 'muscle' : - 134.00, 'organs' : 34.00, }, 'CACHE' :{}, 'CALC' :{ 'scale' : 0.92, 'fatPct' : 0.25, 'musclePct' : 0.30, 'tonePct' : 0.20, 'bmi' : 20.00, }, 'SCALED' :{ 'body' : 346.0, }, 'updated' : Date.now(), }, }, 'MATRIX':{ /* SECONDARY STATS/ENERGY - current values (renewable resources) */ 'vigor' : 130.0, /* STR+PHY - [P] stamina */ 'train' : 80.0, /* STR+WSD - [H] discipline/training */ 'tough' : 34.0, /* STR+END - [P] resistance to damage */ 'power' : 160.0, /* STR+SPD - [P] physical force/lift */ 'skill' : 71.0, /* STR+INS - [H] precision/accuracy */ 'aware' : 44.0, /* PHY+WSD - [H] alertness to environment */ 'vital' : 56.0, /* PHY+END - [P] health */ 'metab' : 47.0, /* PHY+SPD - [P] metabolism */ 'focus' : 28.0, /* PHY+INS - [H] attention to detail */ 'guard' : 63.0, /* WSD+END - [H] active defense */ 'react' : 31.0, /* WSD+SPD - [H] defensive speed/reaction time */ 'psych' : 23.0, /* WSD+INS - [M] psionic energy */ 'regen' : 74.0, /* END+SPD - [P] regeneration/healing */ 'force' : 52.0, /* END+INS - [H] force of will */ 'fight' : 66.0, /* SPD+INS - [H] offensive speed/action time */ /* RESOURCES - (non-stat/non-renewable) */ 'light' : 210.00, /* ? unit */ 'dark' : 150.00, /* ? unit */ 'kcal' : 9999.00, /* food calories consumed, total */ 'protein' : 999.00, /* grams consumed, nutrition */ 'sugar' : 99.00, /* grams consumed, empty calories */ 'money' : 0.00, /* */ 'petro' : 0.000001, /* gallons, remaining */ }, 'METRICS':{ 'age' : 19.0, /* in human years, 3x that actually */ 'base_ht' : 72.0, /* height, inches */ 'ht' : 84.0, /* height, inches */ 'bicep' : 34.0, /* inches; max-curl = power*bicep/30; reps - max/3 */ 'quads' : 42.0, /* inches; max-squat = power*quad/15; reps - max/3 */ 'chest' : 69.0, /* */ 'bust' : 5, /* base cup size */ 'cup' : "E", /* */ 'waist' : 42.0, /* */ 'hips' : 54.0, /* */ 'BMI' : null, /* */ 'bodyfat' : null, /* */ }, 'NAMES': { 'first' : "Lisa", 'full' : "Lt. Lisa Victoria Irons III", 'birth' : "Alyssindra Victoria Irons III", }, 'PASSAGES':{ 'start' : "START LISA", 'home' : "LIVING ON STREET", 'travel' : "WALK SOMEWHERE", }, 'PLACES':{ /* throughout the galaxy! */ }, 'POWERS':{ 'xSTR':{ 'label' : 'Super-Strength', 'rank' : 16.00, }, 'xPHY':{ 'label' : 'Super-Physique', 'rank' : 6.00, }, 'xWSD':{ 'label' : 'Super-Wisdom', 'rank' : 1.00, }, 'xEND':{ 'label' : 'Super-Endurance', 'rank' : 6.00, }, 'xSPD':{ 'label' : 'Super-Speed', 'rank' : 2.00, }, 'xINS':{ 'label' : 'Super-Instinct', 'rank' : 3.00, }, }, 'PROPERTY':{ /* no car */ }, 'S':{ 'STR' :{ 'base': 346.00, 'pow': 16.00, 'PERM':{}, 'TEMP':{}, '~cache':1, }, 'PHY' :{ 'base': 346.00, 'pow': 6.00, 'PERM':{}, 'TEMP':{}, '~cache':1, }, 'WSD' :{ 'base': 346.00, 'pow': 1.00, 'PERM':{}, 'TEMP':{}, '~cache':1, }, 'END' :{ 'base': 346.00, 'pow': 6.00, 'PERM':{}, 'TEMP':{}, '~cache':1, }, 'SPD' :{ 'base': 346.00, 'pow': 2.00, 'PERM':{}, 'TEMP':{}, '~cache':1, }, 'INS' :{ 'base': 346.00, 'pow': 3.00, 'PERM':{}, 'TEMP':{}, '~cache':1, }, 'CALC' :{ 'Lv' : 346.00, 'Cal' : 25.70, 'Mag' : 6.80, 'Cap' : 31.50, 'workout_hrs' : 31.50, 'light_well' : 31.50, 'dark_well' : 31.50, }, }, 'SKILLS':{}, 'SLAVES':{}, 'STATE':{ 'saveVersion' : 0.258, 'feedbackQueue' : [], 'Date' : new Date(), 'lastPassage' : null, 'lastExercise' : null, 'lastActivity' : null, 'lastAction' : null, 'lastItem' : null, }, 'STATUS':{}, 'STUFF':{ /* ID:uses */ /* did not arrive with clothing... or any posessions */ }, 'TRAITS':{ 'gender' : "female", 'species' : "human", /* 'skin_type' : "", */ /* 'skin_color' : "", */ /* 'skin_condition' : "", */ /* 'hair_length' : "", */ /* 'hair_color' : "", */ /* 'hair_style' : "", */ /* 'hair_condition' : "", */ /* 'eye_color' : "", */ /* 'eye_condition' : "", */ /* 'face' : "", */ }, /* END setup.CHARS['Lisa Irons'] */ }>>
Double-click this passage to edit it.
Double-click this passage to edit it.
<<set setup.CHARS['Tammi X'] = { '_':{ 'build_lv':'public', }, 'ABOUT':{ 'who_is':'unemployed waitress', }, 'BODY':{ 'Calves' :{ 'train':1.6, 'damage': 7.1, }, 'Quads' :{ 'train':2.4, 'damage':14.3, }, 'Hams' :{ 'train':1.8, 'damage': 8.8, }, 'Glutes' :{ 'train':2.3, 'damage':12.7, }, 'Hips' :{ 'train':2.1, 'damage':10.1, }, 'LoBack' :{ 'train':1.7, 'damage':14.8, }, 'Lats' :{ 'train':1.6, 'damage': 8.2, }, 'Traps' :{ 'train':2.2, 'damage':17.4, }, 'Abs' :{ 'train':5.4, 'damage':43.7, }, 'Pecs' :{ 'train':3.4, 'damage':22.9, }, 'Delts' :{ 'train':1.8, 'damage': 9.6, }, 'LeftTri' :{ 'train':1.4, 'damage': 7.6, }, 'RightTri' :{ 'train':1.8, 'damage': 8.3, }, 'LeftBi' :{ 'train':1.5, 'damage': 9.9, }, 'RightBi' :{ 'train':1.8, 'damage':11.7, }, 'LeftFore' :{ 'train':1.6, 'damage': 9.6, }, 'RightFore' :{ 'train':2.2, 'damage':12.4, }, 'LeftGrip' :{ 'train':1.8, 'damage': 9.3, }, 'RightGrip' :{ 'train':2.4, 'damage':11.2, }, 'Cardio' :{ 'train':2.7, 'damage':14.6, }, 'Kegel' :{ 'train':3.4, 'damage':19.3, }, 'Brain' :{ 'train':2.7, 'damage':16.4, }, }, 'DEVICES':{}, 'ENEMIES':{}, 'EQUIP':{ /* SLOT:ID */ 'bra' :"D01_A13_I02", 'panties' :"D01_A13_I03", 'pants' :"D01_A09_I02", 'overshirt' :"D01_A10_I01", 'socks' :"D01_A13_I01", }, 'EXSLAVES':{}, 'FRIENDS':{}, 'JUNK':{}, 'LIMBS':{ 'ARML':{ 'total': 8.0, 'min': 8.0, 'parts': 8.0, 'avg':1.0, 'pct':1.0, }, 'ARMR':{ 'total': 8.0, 'min': 8.0, 'parts': 8.0, 'avg':1.0, 'pct':1.0, }, 'ARMS':{ 'total':12.0, 'min':12.0, 'parts':12.0, 'avg':1.0, 'pct':1.0, }, 'CORE':{ 'total': 5.0, 'min': 5.0, 'parts': 5.0, 'avg':1.0, 'pct':1.0, }, 'LEGL':{ 'total': 6.0, 'min': 6.0, 'parts': 6.0, 'avg':1.0, 'pct':1.0, }, 'LEGR':{ 'total': 6.0, 'min': 6.0, 'parts': 6.0, 'avg':1.0, 'pct':1.0, }, 'LEGS':{ 'total': 6.0, 'min': 6.0, 'parts': 6.0, 'avg':1.0, 'pct':1.0, }, 'SEXX':{ 'total': 7.0, 'min': 7.0, 'parts': 7.0, 'avg':1.0, 'pct':1.0, }, }, 'LOVERS':{}, 'M':{ 'WEIGHT' :{ 'BODY' :{ 'bone' : 5.00, 'fat' : 69.00, 'muscle' : - 25.00, 'organs' : 31.00, }, 'CACHE' :{}, 'CALC' :{ 'scale' : 0.96, 'fatPct' : 0.25, 'musclePct' : 0.30, 'tonePct' : 0.20, 'bmi' : 20.00, }, 'SCALED' :{ 'body' : 154.0, }, 'updated' : Date.now(), }, }, 'MATRIX':{ /* SECONDARY STATS/ENERGY - current values (renewable resources) */ 'vigor' : 10.0, /* STR+PHY - [P] stamina */ 'train' : 10.0, /* STR+WSD - [H] discipline/training */ 'tough' : 10.0, /* STR+END - [P] resistance to damage */ 'power' : 10.0, /* STR+SPD - [P] physical force/lift */ 'skill' : 10.0, /* STR+INS - [H] precision/accuracy */ 'aware' : 10.0, /* PHY+WSD - [H] alertness to environment */ 'vital' : 10.0, /* PHY+END - [P] health */ 'metab' : 10.0, /* PHY+SPD - [P] metabolism */ 'focus' : 10.0, /* PHY+INS - [H] attention to detail */ 'guard' : 10.0, /* WSD+END - [H] active defense */ 'react' : 10.0, /* WSD+SPD - [H] defensive speed/reaction time */ 'psych' : 10.0, /* WSD+INS - [M] psionic energy */ 'regen' : 10.0, /* END+SPD - [P] regeneration/healing */ 'force' : 10.0, /* END+INS - [H] force of will */ 'fight' : 10.0, /* SPD+INS - [H] offensive speed/action time */ /* RESOURCES - (non-stat/non-renewable) */ 'light' : 110.00, /* ? unit */ 'dark' : 55.00, /* ? unit */ 'kcal' : 2300.00, /* food calories consumed, total */ 'protein' : 60.00, /* grams consumed, nutrition */ 'sugar' : 180.00, /* grams consumed, empty calories */ 'money' : 198.00, /* */ 'petro' : 0.000001, /* gallons, remaining */ }, 'METRICS':{ 'age' : 23.0, /* years */ 'base_ht' : 72.0, /* height, inches */ 'ht' : 67.0, /* height, inches */ 'bicep' : 8.0, /* inches; max-curl = power*bicep/30; reps - max/3 */ 'quads' : 15.0, /* inches; max-squat = power*quad/15; reps - max/3 */ 'chest' : 30.0, /* */ 'bust' : 10, /* base cup size */ 'cup' : "DD", /* */ 'waist' : 28.0, /* */ 'hips' : 33.0, /* */ 'BMI' : 'not-set', /* */ 'bodyfat' : 'not-set', /* */ }, 'NAMES': { 'first' : "Tammi", 'full' : "Tammi X", /* gets replaced with creed selection */ 'birth' : "Tammi X", /* gets replaced with husband creed selection */ 'married' : "Tammi X", }, 'PASSAGES':{ 'start' : "START TAMMI", 'home' : "LIVING IN MOTEL", 'travel' : "CALL CAB", }, 'PLACES':{ 'MOTEL' : { 'name':"MOTEL", 'PASSAGE':"MOTEL", 'visits':1, }, 'DINER' : { 'name':"DINER", 'PASSAGE':"DINER", 'visits':0, }, }, 'POWERS':{ 'xEND':{ 'label' : 'Super-Endurance', 'rank' : 3.0, }, }, 'PROPERTY':{ /* no car */ }, 'S':{ 'STR' :{ 'base': 31.00, 'pow': 0.00, 'PERM':{}, 'TEMP':{}, '~cache':1, }, 'PHY' :{ 'base': 14.00, 'pow': 0.00, 'PERM':{}, 'TEMP':{}, '~cache':1, }, 'WSD' :{ 'base': 23.00, 'pow': 0.00, 'PERM':{}, 'TEMP':{}, '~cache':1, }, 'END' :{ 'base': 39.00, 'pow': 3.00, 'PERM':{}, 'TEMP':{}, '~cache':1, }, 'SPD' :{ 'base': 34.00, 'pow': 0.00, 'PERM':{}, 'TEMP':{}, '~cache':1, }, 'INS' :{ 'base': 29.00, 'pow': 0.00, 'PERM':{}, 'TEMP':{}, '~cache':1, }, 'CALC' :{ 'Lv' : 29.00, 'Cal' : 7.00, 'Mag' : 3.00, 'Cap' : 10.00, 'workout_hrs' : 10.00, 'light_well' : 10.00, 'dark_well' : 10.00, }, }, 'SKILLS':{}, 'SLAVES':{}, 'STATE':{ 'saveVersion' : 0.258, 'feedbackQueue' : [], 'Date' : new Date(), 'lastPassage' : null, 'lastExercise' : null, 'lastActivity' : null, 'lastAction' : null, 'lastItem' : null, }, 'STATUS':{}, 'STUFF':{ /* lost everything but the clothes on her back! (and whatever is in the trunk of her car) */ /* ID:uses */ 'D01_A09_I02': 60, /* jeans */ 'D01_A10_I01': 30, /* blouse */ 'D01_A13_I02': 50, /* plain white bra */ 'D01_A13_I03': 50, /* plain white panties */ 'D01_A13_I01': 13, /* ankle socks */ 'D05_A05_I02': 45, /* gummi bears */ }, 'TRAITS':{ 'gender' : "female", 'species' : "human", /* 'skin_type' : "", */ /* 'skin_color' : "", */ /* 'skin_condition' : "", */ /* 'hair_length' : "", */ /* 'hair_color' : "", */ /* 'hair_style' : "", */ /* 'hair_condition' : "", */ /* 'eye_color' : "", */ /* 'eye_condition' : "", */ /* 'face' : "", */ }, /* END setup.CHARS['Tammi X'] */ }>>
<p>He thought you were dead; that bastard finally did it. As you lie there unmoving Jason was actually pleased, he felt powerful... he had finally shut you up, for good. Hell, you weren't going anywhere- so rather than deal with his problem he did the usual, went out for a drink and tried to pickup another hot piece of tail. He was always good in the beginning, he would treat them like princesses until he had them so twisted up inside they couldn't escape.</p> <p>It was almost an hour after he left that you regained consciousness, and even then it took another twenty minutes to rally the strength and will to pick yourself off the floor. You listened carefully for any sign he was still awake or home. Finally, panic drove you through the pain... with no clue how long you had been out, you were left with the dread that he would be back soon, and you were NOT going to be here when that happened.</p> <p>You couldn't go to the hospital, he would be the first person they notified. You needed to get out of town, and for that you would need money. You had no choice, you'd have to look around.</p> <p>It took all of your will just to hobble along the furniture toward the bedroom, it felt like your organs had been liquified. Wincing you let out the faintest whimper before clasping your hands over your mouth and praying he didn't wake.</p> <p>You were relieved when you finally saw he wasn't home... no longer afraid to make noise you hurriedly rustled through the dresser and reached deep inside, above the drawer, for the $300 you had stashed away. Thank God he hadn't found it.</p> <p>You quickly called a cab while you gathered what few things you could, and that wait was the longest 15 minutes of your life, knowing that bastard could be back any moment. How had your life come to this? You were an athlete in high school, accomplished in both track and wrestling... how could you feel so physically helpless? You may have gotten a little out of shape these past five years, but you weren't weak. You stared in the mirror not recognizing the pathetic creature before you... how could it be so weak, so stupid, so desperate for affection that it would let someone do this?</p> <p>Your entrancement was short lived though, as the cabbie bleeped the horn. Stupid. You couldn't afford to draw attention now... you stumble to the door and into the cab, leaving the house wide open in the hopes someone would take his expensive TV... the one he spent more on than your entire wedding.</p> <p>The cab and bus fare came to almost a hundred dollars, but you're finally free... heading to a new city with $200 to start over. The pain in your abdomen makes the journey almost unbearable, but you grit your teeth and try not to pass out as the bumps jostle your severely bruised organs around.</p> <p>You find a cheap motel and rent a room for the night...</p> <<run setup.ALIAS.setTime(21,1)>> <p>Even simple tasks like raising your arms overhead to undress and shower prove to be laborious tasks in your condition. You've got a lot to do tomorrow, perhaps you should <span class='keypress' key='[SPACE]'>[[go to bed->SLEEP IN BED]]</span>.</p>
<p class='narrow'><<if setup.ALIAS.canDo('EXPLORE', 'search', 15/60, 1.0, $G.PC)>>[[GO SHOPPING->S-MART]]<</if>></p> <p class='narrow'><<if setup.ALIAS.canDo('EXPLORE', 'search', 30/60, 1.0, $G.PC)>>[[LOOK FOR CHANGE]]<</if>></p> <p></p> <p class='narrow'><<if setup.ALIAS.canDo('TRAIN', 'walk', 5/60, 0.5, $G.PC)>>[[GO FOR A WALK]]<</if>></p> <p class='narrow'><<if setup.ALIAS.canDo('TRAIN', 'jog', 5/60, 0.5, $G.PC)>>[[GO FOR A JOG]]<</if>></p> <p class='narrow'><<if setup.ALIAS.canDo('TRAIN', 'run', 5/60, 0.5, $G.PC)>>[[GO FOR A RUN]]<</if>></p> <p></p> <p class='narrow'><<if setup.ALIAS.canDo('TRAIN', 'calisthenics', 5/60, 0.5, $G.PC)>>[[DO CALISTHENICS]]<</if>></p>
<p class='narrow'><<if setup.ALIAS.canDo('REST', 'sleep', 3, 1.0, $G.PC) >>[[SLEEP FOR 8 HOURS->SLEEP IN BED]]<</if>></p> <p class='narrow'><<if setup.ALIAS.canDo('REST', 'sleep', 1, 1.0, $G.PC) >>[[TAKE A 2 HOUR NAP->TAKE A NAP]]<</if>></p> <p class='narrow'><<if setup.ALIAS.canDo('REST', 'rest', 15/60, 1.0, $G.PC) >>[[REST FOR 20 MIN->REST A BIT]]<</if>></p> <p></p> <p class='narrow'><<if setup.ALIAS.canDo('EXPLORE', 'search', 30/60, 1.0, $G.PC) >>[[WALK TO 6 t' 9->GAS STATION]]<</if>></p> <p class='narrow'><<if setup.ALIAS.canDo('EXPLORE', 'search', 45/60, 1.0, $G.PC) >>[[WALK TO GYM->GYM]]<</if>></p> <p class='narrow'><<if setup.ALIAS.canDo('EXPLORE', 'search', 30/60, 1.0, $G.PC) >>[[WALK TO DINER->DINER]]<</if>></p> <p></p> <p class='narrow'><<print setup.ALIAS.carOrCab($G.PC);>></p> <p class='narrow'><<if setup.ALIAS.canDo('EXPLORE', 'search', 30/60, 1.0, $G.PC) >>[[LOOK FOR CHANGE]]<</if>></p> <p></p> <p class='narrow'><<if setup.ALIAS.canDo('TRAIN', 'walk', 5/60, 0.5, $G.PC) >>[[GO FOR A WALK]]<</if>></p> <p class='narrow'><<if setup.ALIAS.canDo('TRAIN', 'jog', 5/60, 0.5, $G.PC) >>[[GO FOR A JOG]]<</if>></p> <p class='narrow'><<if setup.ALIAS.canDo('TRAIN', 'run', 5/60, 0.5, $G.PC) >>[[GO FOR A RUN]]<</if>></p> <p></p> <p class='narrow'><<if setup.ALIAS.canDo('TRAIN', 'aerobics', 5/60, 0.5, $G.PC) >>[[DO AEROBICS]]<</if>></p> <p class='narrow'><<if setup.ALIAS.canDo('TRAIN', 'calisthenics', 5/60, 0.5, $G.PC) >>[[DO CALISTHENICS]]<</if>></p> <p class='narrow'><<if setup.ALIAS.canDo('TRAIN', 'yoga', 5/60, 0.5, $G.PC) >>[[DO YOGA]]<</if>></p>
<p class='narrow'><<if setup.ALIAS.canDo('REST', 'sleep', 3, 1.0, $G.PC) >>[[SLEEP FOR 5 HOURS->SLEEP IN CAR]]<</if>></p> <p class='narrow'><<if setup.ALIAS.canDo('REST', 'sleep', 1, 1.0, $G.PC) >>[[TAKE A 2 HOUR NAP->TAKE A NAP]]<</if>></p> <p class='narrow'><<if setup.ALIAS.canDo('REST', 'rest', 15/60, 1.0, $G.PC) >>[[REST FOR 20 MIN->REST A BIT]]<</if>></p> <p></p> <p class='narrow'><<if setup.ALIAS.canDo('EXPLORE', 'drive', 15/60, 1.0, $G.PC) >>[[DRIVE SOMEWHERE]]<</if>></p>
<<include 'NAVIGATION'>>
<<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<run setup.ALIAS.doRest('sleep', 8, $G.PC); >><<set _time = setup.ALIAS.getTime();>> <<if ("05:30"<_time)&&(_time<"07:30")>> <<run setup.ALIAS.giveFeedback("You wake up at first light, but the store won't be open for another hour. What do you do?");>> <</if>> <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>>
<<if (_hrs) && (_lv)>> <<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<run setup.ALIAS.doWorkout('aerobics', _hrs, _lv, $G.PC); >> <<replace '#datetime'>><<include 'DATETIME'>><</replace>> <p><<print setup.ALIAS.descMissing('AEROBIC WORKOUT');>></p> <p></p> <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>> <<else>> <<print setup.ALIAS.workoutTable('aerobics', null, null, $G.PC); >> <p class='keypress' key='[SPACE]'>[[RETURN->GO HOME]]</p> <</if>>
<<if (_hrs) && (_lv)>> <<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<run setup.ALIAS.doWorkout('yoga', _hrs, _lv, $G.PC); >> <<replace '#datetime'>><<include 'DATETIME'>><</replace>> <p><<print setup.ALIAS.descMissing('YOGA WORKOUT');>></p> <p></p> <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>> <<else>> <<print setup.ALIAS.workoutTable('yoga', null, null, $G.PC); >> <p class='keypress' key='[SPACE]'>[[RETURN->GO HOME]]</p> <</if>>
Double-click this passage to edit it.
<<set setup.DESC={ 'ht' : function(CHAR) { var sE = setup.ALIAS; var ht = CHAR.METRICS.ht; var gen = (('she'==sE.he_she(CHAR.TRAITS.gender))?'f':'m'); var f = 'f'==gen; var out = ''; /* 27 levels */ switch(true) { /* 1 inches */ case (ht < 1): out = ( 'a bug' ); break; /* 6 inches */ case (ht < 6): out = ( 'minuscule' ); break; /* 1 foot */ case (ht < 12): out = ( 'tiny' ); break; /* 1 feet, 6 inches */ case (ht < 18): out = ( 'little' ); break; /* 2 feet */ case (ht < 24): out = ( 'a gnome' ); break; /* 2 feet, 6 inches */ case (ht < 30): out = ( 'incredibly short' ); break; /* 3 feet */ case (ht < 36): out = ( 'fantastically short' ); break; /* 3 feet, 6 inches */ case (ht < 42): out = ( 'spectacularly short' ); break; /* 4 feet */ case (ht < 48): out = ( 'exceedingly short' ); break; /* 4 feet, 6 inches */ case (ht < 54): out = ( 'very short' ); break; /* 5 feet */ case (ht < 60): out = ( 'rather short' ); break; /* 5 feet, 4 inches */ case (ht < 64): out = ( 'a bit short' ); break; /* 1 mile */ case (ht > 63360): out = (f ? 'a goddess' : 'a god' ); break; /* 100 feet */ case (ht > 1200): out = (f ? 'a titaness' : 'a titan' ); break; /* 75 feet */ case (ht > 900): out = ( 'a kaiju' ); break; /* 50 feet */ case (ht > 600): out = ( 'ginormous' ); break; /* 35 feet */ case (ht > 420): out = (f ? 'a great giantess' : 'a great giant' ); break; /* 24 feet */ case (ht > 288): out = (f ? 'a giantess' : 'a giant' ); break; /* 13 feet, 4 inches */ case (ht > 160): out = (f ? 'a mini-giantess' : 'a mini-giant' ); break; /* 10 feet */ case (ht > 120): out = (f ? 'of Amazonian height' : 'of epic height' ); break; /* 8 feet, 6 inches */ case (ht > 102): out = ( 'monumentally tall' ); break; /* 7 feet, 6 inches */ case (ht > 90): out = ( 'spectacularly tall' ); break; /* 7 feet */ case (ht > 84): out = ( 'exceedingly tall' ); break; /* 6 feet, 6 inches */ case (ht > 78): out = ( 'very tall' ); break; /* 6 feet */ case (ht > 72): out = ( 'rather tall' ); break; /* 5 feet, 8 inches */ case (ht > 68): out = ( 'a bit tall' ); break; /* 5 feet 4-8 inches */ default: out = ( 'of average height' ); break; } return out; }, 'wt' : function(CHAR) { var out = ''; var wt = setup.ALIAS.weightGet('scaled', CHAR); /* 42 levels */ /* account for variable-bodymass and percentage bodyfat */ switch(true) { case (wt < 0.1): out = 'a few ounces'; break; case (wt < 1.0): out = 'a pint'; break; case (wt < 10.0): out = 'impossibly thin'; break; case (wt < 30.0): out = 'inhumanly thin'; break; case (wt < 50.0): out = 'a walking skeleton'; break; case (wt < 70.0): out = 'starving'; break; case (wt < 85.0): out = 'tiny'; break; case (wt < 100.0): out = 'small'; break; case (wt < 115.0): out = 'petite'; break; case (wt >2200000000.0): out = 'over a megaton'; break; case (wt > 220000000.0): out = '[100 kt+]'; break; case (wt > 22000000.0): out = '[10 kt+]'; break; case (wt > 2200000.0): out = 'over a kiloton'; break; case (wt > 1000000.0): out = '[500+ tons]'; break; case (wt > 750000.0): out = '[375+ tons]'; break; case (wt > 500000.0): out = '[250+ tons]'; break; case (wt > 250000.0): out = '[125+ tons]'; break; case (wt > 100000.0): out = '[50+ tons]'; break; case (wt > 80000.0): out = '[40+ tons]'; break; case (wt > 65000.0): out = '[32+ tons]'; break; case (wt > 50000.0): out = '[25+ tons]'; break; case (wt > 40000.0): out = '[20+ tons]'; break; case (wt > 30000.0): out = '[15+ tons]'; break; case (wt > 20000.0): out = '[10+ tons]'; break; case (wt > 15000.0): out = '[7+ tons]'; break; case (wt > 10000.0): out = '[5+ tons]'; break; case (wt > 7500.0): out = '[7500+]'; break; case (wt > 5000.0): out = '[5000+]'; break; case (wt > 3500.0): out = '[3500+]'; break; case (wt > 2000.0): out = 'you weight a ton'; break; case (wt > 1500.0): out = 'three quarter ton'; break; case (wt > 1000.0): out = 'a half ton'; break; case (wt > 850.0): out = 'colossal'; break; case (wt > 600.0): out = 'enormous'; break; case (wt > 500.0): out = 'a quarter ton'; break; case (wt > 400.0): out = 'massive'; break; case (wt > 350.0): out = 'huge'; break; case (wt > 300.0): out = 'big'; break; case (wt > 250.0): out = 'bulky'; break; case (wt > 200.0): out = 'large'; break; case (wt > 165.0): out = 'of solid build'; break; default: out = 'average weight'; break; } return out; }, 'height' : function(CHAR) { return setup.DESC.ht(CHAR); }, 'weight' : function(CHAR) { return setup.DESC.wt(CHAR); }, /* 'race' : function(CHAR) {}, */ /* 'skin_type' : function(CHAR) {}, */ /* 'skin_color' : function(CHAR) {}, */ /* 'skin_condition' : function(CHAR) {}, */ /* 'hair_length' : function(CHAR) {}, */ /* 'hair_color' : function(CHAR) {}, */ /* 'hair_style' : function(CHAR) {}, */ /* 'hair_condition' : function(CHAR) {}, */ /* 'eye_color' : function(CHAR) {}, */ /* 'eye_condition' : function(CHAR) {}, */ /* 'face' : function(CHAR) {}, */ 'arms' : function(CHAR) { var out = ''; var armsize = CHAR.METRICS.bicep+CHAR.METRICS.forearm; /* 10 levels */ switch(true) { case (armsize > 85*1.6): out = 'absurdly huge'; break; case (armsize > 50*1.6): out = 'monstrous'; break; case (armsize > 35*1.6): out = 'enormous'; break; case (armsize > 25*1.6): out = 'freakish'; break; case (armsize > 22*1.6): out = 'massive'; break; case (armsize > 19*1.6): out = 'huge'; break; case (armsize > 14*1.6): out = 'bulky'; break; case (armsize > 10*1.6): out = 'fairly average'; break; case (armsize > 7*1.6): out = 'small'; break; default: out = 'scrawny'; break; } return out; }, 'delts' : function(CHAR) { var out = ''; var size = CHAR.BODY.Delts.train; /* 13 levels */ switch(true) { case (size > 15.0): out = 'freakish'; break; case (size > 13.0): out = 'monstrous'; break; case (size > 11.0): out = 'enormous'; break; case (size > 9.0): out = 'bulky'; break; case (size > 8.0): out = 'massive'; break; case (size > 7.0): out = 'huge'; break; case (size > 6.0): out = 'solid'; break; case (size > 5.0): out = 'prominent'; break; case (size > 4.0): out = 'large'; break; case (size > 3.0): out = 'firm'; break; case (size > 2.0): out = 'modest'; break; case (size > 1.0): out = 'unremarkable'; break; default: out = 'barely noticeable'; break; } return out; }, 'bicep' : function(CHAR) { return this.bicep_tone(CHAR) +' '+ this.bicep_size(CHAR); }, 'bicep_tone' : function(CHAR) { var out = ''; var B = CHAR.BODY; var tone = (B['LeftBi'].tone+B['RightBi'].tone)/2; /* 12 levels */ switch(true) { case (tone > 0.99): out = 'impossibly-hard'; break; case (tone > 0.96): out = 'diamond-hard'; break; case (tone > 0.92): out = 'rock-hard'; break; case (tone > 0.87): out = 'steely'; break; case (tone > 0.81): out = 'sinewy'; break; case (tone > 0.74): out = 'solid'; break; case (tone > 0.66): out = 'firm'; break; case (tone > 0.57): out = 'toned'; break; case (tone > 0.47): out = 'soft'; break; case (tone > 0.36): out = 'squishy'; break; case (tone > 0.24): out = 'pudgy'; break; default: out = 'flabby'; break; } return out; }, 'bicep_size' : function(CHAR) { var out = ''; var bicep=CHAR.METRICS.bicep; /* 19 levels */ switch(true) { case (bicep > 250): out = 'gargantuan'; break; case (bicep > 100): out = 'titanic'; break; case (bicep > 80): out = 'absurdly large'; break; case (bicep > 60): out = 'comically large'; break; case (bicep > 50): out = 'impossibly large'; break; case (bicep > 42): out = 'monstrous'; break; case (bicep > 36): out = 'insane'; break; case (bicep > 32): out = 'inhuman'; break; case (bicep > 28): out = 'colossal'; break; case (bicep > 24): out = 'freakish'; break; case (bicep > 21): out = 'tremendous'; break; case (bicep > 18): out = 'massive'; break; case (bicep > 15): out = 'huge'; break; case (bicep > 12): out = 'large'; break; case (bicep > 10): out = 'modest'; break; case (bicep > 8): out = 'unimpressive'; break; case (bicep > 6): out = 'small'; break; case (bicep > 4): out = 'puny'; break; default: out = 'tiny'; break; } return out; }, 'forearm' : function(CHAR) { return this.forearm_size(CHAR) +' '+ this.forearm_tone(CHAR); }, 'forearm_tone' : function(CHAR) { var out = ''; var B = CHAR.BODY; var tone = (B['LeftFore'].tone+B['RightFore'].tone)/2; /* 12 levels */ switch(true) { case (tone > 0.99): out = 'impossibly-hard'; break; case (tone > 0.96): out = 'diamond-hard'; break; case (tone > 0.92): out = 'rock-hard'; break; case (tone > 0.87): out = 'steely'; break; case (tone > 0.81): out = 'sinewy'; break; case (tone > 0.74): out = 'solid'; break; case (tone > 0.66): out = 'firm'; break; case (tone > 0.57): out = 'toned'; break; case (tone > 0.47): out = 'soft'; break; case (tone > 0.36): out = 'squishy'; break; case (tone > 0.24): out = 'pudgy'; break; default: out = 'flabby'; break; } return out; }, 'forearm_size' : function(CHAR) { var out = ''; var size = CHAR.METRICS.forearm; /* 10 levels */ switch(true) { case (size > 47): out = 'monstrous'; break; case (size > 38): out = 'enormous'; break; case (size > 30): out = 'freakish'; break; case (size > 23): out = 'hulking'; break; case (size > 17): out = 'bulky'; break; case (size > 12): out = 'very large'; break; case (size > 8): out = 'big'; break; case (size > 6): out = 'normal'; break; case (size > 5): out = 'slender'; break; default: out = 'frail'; break; } return out; }, 'legs' : function(CHAR) { var out = ''; var armsize = CHAR.METRICS.quads+CHAR.METRICS.calf; /* 11 levels */ switch(true) { case (armsize > 64*3.4): out = 'gargantuan'; break; case (armsize > 48*3.4): out = 'freakish'; break; case (armsize > 36*3.4): out = 'monstrous'; break; case (armsize > 24*3.4): out = 'enormous'; break; case (armsize > 21*3.4): out = 'thunderous'; break; case (armsize > 18*3.4): out = 'massive'; break; case (armsize > 15*3.4): out = 'bulky'; break; case (armsize > 12*3.4): out = 'athletic'; break; case (armsize > 9*3.4): out = 'typical'; break; case (armsize > 7*3.4): out = 'small'; break; default: out = 'scrawny'; break; } return out; }, 'quads' : function(CHAR) { return this.quads_size(CHAR) +' '+ this.quads_tone(CHAR); }, 'quads_tone' : function(CHAR) { var out = ''; var B = CHAR.BODY; var tone = B['Quads'].tone; /* 12 levels */ switch(true) { case (tone > 0.99): out = 'impossibly-hard'; break; case (tone > 0.96): out = 'diamond-hard'; break; case (tone > 0.92): out = 'rock-hard'; break; case (tone > 0.87): out = 'steely'; break; case (tone > 0.81): out = 'sinewy'; break; case (tone > 0.74): out = 'solid'; break; case (tone > 0.66): out = 'firm'; break; case (tone > 0.57): out = 'toned'; break; case (tone > 0.47): out = 'soft'; break; case (tone > 0.36): out = 'squishy'; break; case (tone > 0.24): out = 'pudgy'; break; default: out = 'flabby'; break; } return out; }, 'quads_size' : function(CHAR) { var out = ''; var size = CHAR.METRICS.quads; /* 13 levels */ switch(true) { case (size > 80): out = 'enormous'; break; case (size > 64): out = 'monstrous'; break; case (size > 50): out = 'freakish'; break; case (size > 38): out = 'massive'; break; case (size > 33): out = 'thick'; break; case (size > 28): out = 'bulky'; break; case (size > 24): out = 'full'; break; case (size > 20): out = 'shapely'; break; case (size > 16): out = 'slender'; break; case (size > 12): out = 'thin'; break; case (size > 8): out = 'slim'; break; case (size > 6): out = 'skinny'; break; default: out = 'scrawny'; break; } return out; }, 'calf' : function(CHAR) { return this.calf_size(CHAR) +' '+ this.calf_tone(CHAR); }, 'calf_tone' : function(CHAR) { var out = ''; var B = CHAR.BODY; var tone = B['Calves'].tone; /* 12 levels */ switch(true) { case (tone > 0.99): out = 'impossibly-hard'; break; case (tone > 0.96): out = 'diamond-hard'; break; case (tone > 0.92): out = 'rock-hard'; break; case (tone > 0.87): out = 'steely'; break; case (tone > 0.81): out = 'sinewy'; break; case (tone > 0.74): out = 'solid'; break; case (tone > 0.66): out = 'firm'; break; case (tone > 0.57): out = 'toned'; break; case (tone > 0.47): out = 'soft'; break; case (tone > 0.36): out = 'squishy'; break; case (tone > 0.24): out = 'pudgy'; break; default: out = 'flabby'; break; } return out; }, 'calf_size' : function(CHAR) { var out = ''; var size = CHAR.METRICS.calf; /* 10 levels */ switch(true) { case (size > 49): out = 'insane'; break; case (size > 40): out = 'monstrous'; break; case (size > 32): out = 'freakish'; break; case (size > 25): out = 'enormous'; break; case (size > 19): out = 'huge'; break; case (size > 14): out = 'large'; break; case (size > 10): out = 'modest'; break; case (size > 7): out = 'slim'; break; case (size > 5): out = 'thin'; break; default: out = 'frail'; break; } return out; }, 'chest' : function(CHAR) { var out = ''; var size = CHAR.METRICS.chest; /* 24 levels */ switch(true) { case (size > 150): out = 'gargantuan'; break; case (size > 120): out = 'monsterous'; break; case (size > 100): out = 'freakish'; break; case (size > 86): out = 'inhuman'; break; case (size > 82): out = 'tremendous'; break; case (size > 78): out = 'giant'; break; case (size > 74): out = 'enormous'; break; case (size > 70): out = 'massive'; break; case (size > 66): out = 'expansive'; break; case (size > 62): out = 'very large'; break; case (size > 58): out = 'huge'; break; case (size > 54): out = 'wide'; break; case (size > 50): out = 'thick'; break; case (size > 46): out = 'bulky'; break; case (size > 42): out = 'large'; break; case (size > 38): out = 'solid'; break; case (size > 34): out = 'average'; break; case (size > 30): out = 'modest'; break; case (size > 26): out = 'narrow'; break; case (size > 22): out = 'slender'; break; case (size > 18): out = 'slim'; break; case (size > 14): out = 'petite'; break; case (size > 10): out = 'small'; break; default: out = 'tiny'; break; } return out; }, 'pecs' : function(CHAR) { return this.pecs_tone(CHAR) +' '+ this.pecs_size(CHAR); }, 'pecs_tone' : function(CHAR) { var out = ''; var B = CHAR.BODY; var tone = B['Pecs'].tone; /* 12 levels */ switch(true) { case (tone > 0.99): out = 'impossibly-hard'; break; case (tone > 0.96): out = 'diamond-hard'; break; case (tone > 0.92): out = 'rock-hard'; break; case (tone > 0.87): out = 'steely'; break; case (tone > 0.81): out = 'sinewy'; break; case (tone > 0.74): out = 'solid'; break; case (tone > 0.66): out = 'firm'; break; case (tone > 0.57): out = 'toned'; break; case (tone > 0.47): out = 'soft'; break; case (tone > 0.36): out = 'squishy'; break; case (tone > 0.24): out = 'pudgy'; break; default: out = 'flabby'; break; } return out; }, 'pecs_size' : function(CHAR) { var out = ''; var size = CHAR.METRICS.pecs; /* 27 levels */ switch(true) { case (size > 24.0): out = 'inhuman'; break; case (size > 16.0): out = 'colossal'; break; case (size > 12.0): out = 'gargantuan'; break; case (size > 10.0): out = 'monsterous'; break; case (size > 9.0): out = 'freakish'; break; case (size > 8.0): out = 'tremendous'; break; case (size > 7.0): out = 'overflowing'; break; case (size > 6.0): out = 'gigantic'; break; case (size > 5.5): out = 'enormous'; break; case (size > 5.0): out = 'massive'; break; case (size > 4.5): out = 'expanding'; break; case (size > 4.0): out = 'very large'; break; case (size > 3.6): out = 'huge'; break; case (size > 3.2): out = 'wide'; break; case (size > 2.8): out = 'deep'; break; case (size > 2.4): out = 'expansive'; break; case (size > 2.0): out = 'bulky'; break; case (size > 1.8): out = 'thick'; break; case (size > 1.6): out = 'solid'; break; case (size > 1.4): out = 'decent'; break; case (size > 1.2): out = 'fair'; break; case (size > 1.0): out = 'moderate'; break; case (size > 0.8): out = 'modest'; break; case (size > 0.6): out = 'slim'; break; case (size > 0.4): out = 'slender'; break; case (size > 0.2): out = 'small'; break; default: out = 'flat'; break; } return out; }, 'lats' : function(CHAR) { var out = ''; var size = CHAR.BODY.Lats.train; /* 12 levels */ switch(true) { case (size > 18.0): out = 'freakish'; break; case (size > 16.0): out = 'massive'; break; case (size > 14.0): out = 'monstrous'; break; case (size > 12.0): out = 'enormous'; break; case (size > 10.0): out = 'bulky'; break; case (size > 8.0): out = 'huge'; break; case (size > 6.0): out = 'wide'; break; case (size > 5.0): out = 'prominent'; break; case (size > 4.0): out = 'decent'; break; case (size > 3.0): out = 'modest'; break; case (size > 2.0): out = 'tiny'; break; default: out = 'absent'; break; } return out; }, 'bust' : function(CHAR) { var out = ''; var size = CHAR.METRICS.cup; /* 29 levels */ switch(true) { /* OMG */ case (size >39.0): out = 'freakish'; break; /* VV */ case (size >38.0): /* V */ case (size >37.0): /* W */ case (size >36.0): out = 'colossal'; break; /* U */ case (size >35.0): /* TT */ case (size >34.0): /* T */ case (size >33.0): out = 'ginormous'; break; /* SS */ case (size >32.0): /* S */ case (size >31.0): /* RR */ case (size >30.0): out = 'titanic'; break; /* R */ case (size >29.0): /* QQ */ case (size >28.0): /* Q */ case (size >27.0): out = 'monstrous'; break; /* PP */ case (size >26.0): /* P */ case (size >25.0): /* OO */ case (size >24.0): out = 'enormous'; break; /* O */ case (size >23.0): /* NN */ case (size >22.0): /* N */ case (size >21.0): out = 'gigantic'; break; /* MM */ case (size >20.0): out = 'beachball sized'; break; /* M */ case (size >19.0): /* LL */ case (size >18.0): out = 'massive'; break; /* L */ case (size >17.0): /* KK */ case (size >16.0): /* K */ case (size >15.0): out = 'obscene'; break; /* JJ */ case (size >14.0): out = 'overflowing'; break; /* J */ case (size >13.0): out = 'watermelon sized'; break; /* HH */ case (size >12.0): out = 'huge'; break; /* H */ case (size >11.0): out = 'basketball sized'; break; /* GG */ case (size >10.0): out = 'bountiful'; break; /* G */ case (size > 9.0): out = 'soccerball sized'; break; /* FF */ case (size > 8.0): out = 'large'; break; /* F */ case (size > 7.0): out = 'bowlingball sized'; break; /* E */ case (size > 6.0): out = 'cantaloupe sized'; break; /* DD */ case (size > 5.0): out = 'volleyball sized'; break; /* D */ case (size > 4.0): out = 'grapefruit sized'; break; case (size > 3.5): out = 'softball sized'; break; /* C */ case (size > 3.0): out = 'orange sized'; break; case (size > 2.5): out = 'baseball sized'; break; /* B */ case (size > 2.0): out = 'perky'; break; case (size > 1.5): out = 'tennis ball sized'; break; /* A */ case (size > 1.0): out = 'small'; break; case (size > 0.5): out = 'golfball sized'; break; /* AA */ default: out = 'flat'; break; } return out; }, 'breast_shape' : function(CHAR) { return "<span class='disabled'>[BREAST_SHAPE]</span>"; }, 'waist' : function(CHAR) { return this.waist_size(CHAR) +' '+ this.waist_tone(CHAR); }, 'waist_tone' : function(CHAR) { var out = ''; var B = CHAR.BODY; var tone = B['Abs'].tone; /* 12 levels */ switch(true) { case (tone > 0.99): out = 'impossibly-hard'; break; case (tone > 0.96): out = 'diamond-hard'; break; case (tone > 0.92): out = 'rock-hard'; break; case (tone > 0.87): out = 'steely'; break; case (tone > 0.81): out = 'sinewy'; break; case (tone > 0.74): out = 'solid'; break; case (tone > 0.66): out = 'firm'; break; case (tone > 0.57): out = 'toned'; break; case (tone > 0.47): out = 'soft'; break; case (tone > 0.36): out = 'squishy'; break; case (tone > 0.24): out = 'pudgy'; break; default: out = 'flabby'; break; } return out; }, 'waist_size' : function(CHAR) { var out = ''; var size = CHAR.METRICS.waist; /* 28 levels */ switch(true) { case (size > 90): out = 'gargantuan'; break; case (size > 87): out = 'monsterous'; break; case (size > 84): out = 'freakish'; break; case (size > 81): out = 'inhuman'; break; case (size > 78): out = '2 meter'; break; case (size > 75): out = 'tremendous'; break; case (size > 72): out = 'overflowing'; break; case (size > 69): out = 'giant'; break; case (size > 66): out = 'enormous'; break; case (size > 63): out = 'massive'; break; case (size > 57): out = 'expanding'; break; case (size > 54): out = 'expansive'; break; case (size > 51): out = 'very large'; break; case (size > 48): out = 'huge'; break; case (size > 45): out = 'wide'; break; case (size > 42): out = 'thick'; break; case (size > 39): out = 'bulky'; break; case (size > 36): out = 'large'; break; case (size > 33): out = 'solid'; break; case (size > 30): out = 'average'; break; case (size > 27): out = 'modest'; break; case (size > 24): out = 'small'; break; case (size > 21): out = 'narrow'; break; case (size > 18): out = 'slender'; break; case (size > 15): out = 'slim'; break; case (size > 12): out = 'petite'; break; case (size > 9): out = 'tiny'; break; default: out = 'impossible'; break; } return out; }, 'abs' : function(CHAR) { var sX=setup.ALIAS; var out = ''; var Abs = CHAR.BODY.Abs; var fatPct = sX.weightGet('bodyfat', CHAR); var WT = CHAR.M.WEIGHT.SCALED; var S = sX.statGet('all', 'current', CHAR); var M=CHAR.METRICS; var FACTORS = { 'train' : (Abs.train+S.magnitude) / S.difficulty_level, 'tone' : (Abs.tone-fatPct) * S.caliber, 'fat' : (WT.muscle/4 -WT.fat) / 10.0, 'waist' : -(M.waist -M.hips) * 0.5, }; var size = ( FACTORS.train + FACTORS.tone + FACTORS.fat + FACTORS.waist ); /* sX.WTF(FACTORS); */ /* 19 levels */ switch(true) { case (size > 55.0): out = 'a godly twelve-pack'; break; case (size > 50.0): out = 'diamond-cut abs'; break; case (size > 45.0): out = 'an unbreakable ten-pack'; break; case (size > 40.5): out = 'impenetrable abs'; break; case (size > 36.0): out = 'thick abdominal blocks'; break; case (size > 32.0): out = 'steely abs'; break; case (size > 28.0): out = 'a solid wall of muscle'; break; case (size > 24.5): out = 'a prominent eight-pack'; break; case (size > 21.0): out = 'a solid eight-pack'; break; case (size > 18.0): out = 'a solid six-pack'; break; case (size > 15.0): out = 'a modest six-pack'; break; case (size > 12.5): out = 'a flat six-pack'; break; case (size > 10.0): out = 'a noticeable four-pack'; break; case (size > 8.0): out = 'a faint four-pack'; break; case (size > 6.0): out = 'a soft line down the middle, forming a distinct two-pack, '; break; case (size > 4.5): out = 'the barest hint of abs'; break; case (size > 3.0): out = 'a firm stomach'; break; case (size > 2.0): out = 'a taught stomach'; break; case (size > 1.0): out = 'a flat belly'; break; case (size > 0.0): out = 'a smooth stomach'; break; case (size >- 1.0): out = 'a paunch'; break; case (size >- 3.0): out = 'a noticeable gut'; break; case (size >- 6.0): out = 'a bit of pudge'; break; case (size >-10.0): out = 'a small pot belly'; break; case (size >-15.0): out = 'a growing beer belly'; break; case (size >-21.0): out = 'a significant gut'; break; case (size >-28.0): out = 'a big belly'; break; case (size >-36.0): out = 'a sizeable gut'; break; case (size >-45.0): out = 'a huge belly'; break; case (size >-55.0): out = 'an enormous gut'; break; default: out = 'a tremendous stomach'; break; } return out; }, 'hips' : function(CHAR) { var out = ''; var size = CHAR.METRICS.hips; /* 27 levels */ switch(true) { case (size > 150): out = 'gargantuan'; break; case (size > 120): out = 'monsterous'; break; case (size > 100): out = 'freakish'; break; case (size > 96): out = 'inhuman'; break; case (size > 92): out = 'tremendous'; break; case (size > 88): out = 'overflowing'; break; case (size > 84): out = 'giant'; break; case (size > 80): out = 'enormous'; break; case (size > 76): out = 'massive'; break; case (size > 72): out = 'expanding'; break; case (size > 68): out = 'expansive'; break; case (size > 64): out = 'very large'; break; case (size > 60): out = 'huge'; break; case (size > 56): out = 'wide'; break; case (size > 52): out = 'thick'; break; case (size > 48): out = 'bulky'; break; case (size > 44): out = 'large'; break; case (size > 40): out = 'solid'; break; case (size > 36): out = 'average'; break; case (size > 32): out = 'modest'; break; case (size > 28): out = 'small'; break; case (size > 24): out = 'narrow'; break; case (size > 20): out = 'slender'; break; case (size > 16): out = 'slim'; break; case (size > 12): out = 'petite'; break; case (size > 8): out = 'tiny'; break; default: out = 'flat'; break; } return out; }, 'butt' : function(CHAR) { return this.butt_size(CHAR) +' '+ this.butt_tone(CHAR); }, 'butt_size' : function(CHAR) { var sX=setup.ALIAS; var out = ''; var Butt = CHAR.BODY.Glutes; var fatPct = sX.weightGet('bodyfat', CHAR); var WT = CHAR.M.WEIGHT.SCALED; var S = sX.statGet('all', 'current', CHAR); var M=CHAR.METRICS; var FACTORS = { 'train' : (Butt.train-S.caliber) / S.difficulty_level, 'tone' : (Butt.tone+fatPct) * S.magnitude, 'muscle' : sX.unstack(WT.muscle/5) -1, 'fat' : sX.unstack(WT.fat/5) -2, }; var size = ( FACTORS.train + FACTORS.tone + FACTORS.muscle + FACTORS.fat ); /* sX.WTF(FACTORS); */ /* 17 levels */ switch(true) { case (size > 78.0): out = 'freakish'; break; case (size > 66.0): out = 'monstrous'; break; case (size > 55.0): out = 'enormous'; break; case (size > 45.0): out = 'bulky'; break; case (size > 36.0): out = 'massive'; break; case (size > 28.0): out = 'huge'; break; case (size > 21.0): out = 'thick'; break; case (size > 18.0): out = 'solid'; break; case (size > 15.0): out = 'large'; break; case (size > 12.5): out = 'prominent'; break; case (size > 10.0): out = 'big'; break; case (size > 8.0): out = 'supple'; break; case (size > 6.0): out = 'round'; break; case (size > 5.0): out = 'onion'; break; case (size > 4.0): out = 'modest'; break; case (size > 3.0): out = 'tight'; break; case (size > 2.0): out = 'slim'; break; default: out = 'tiny'; break; } return out; }, 'butt_tone' : function(CHAR) { var out = ''; var B = CHAR.BODY; var tone = B['Glutes'].tone; /* 12 levels */ switch(true) { case (tone > 0.99): out = 'impossibly-hard'; break; case (tone > 0.96): out = 'diamond-hard'; break; case (tone > 0.92): out = 'rock-hard'; break; case (tone > 0.87): out = 'steely'; break; case (tone > 0.81): out = 'sinewy'; break; case (tone > 0.74): out = 'solid'; break; case (tone > 0.66): out = 'firm'; break; case (tone > 0.57): out = 'toned'; break; case (tone > 0.47): out = 'soft'; break; case (tone > 0.36): out = 'squishy'; break; case (tone > 0.24): out = 'pudgy'; break; default: out = 'flabby'; break; } return out; }, 'bodytone' : function(CHAR) { var out = ''; var tone = setup.ALIAS.weightGet('bodytone', CHAR); /* 12 levels */ switch(true) { case (tone > 0.99): out = 'impossibly-ripped'; break; case (tone > 0.96): out = 'completely shredded'; break; case (tone > 0.92): out = 'swole as fuck'; break; case (tone > 0.87): out = 'ripped'; break; case (tone > 0.81): out = 'swole'; break; case (tone > 0.74): out = 'sinewy'; break; case (tone > 0.66): out = 'solid'; break; case (tone > 0.57): out = 'toned'; break; case (tone > 0.47): out = 'soft'; break; case (tone > 0.36): out = 'squishy'; break; case (tone > 0.24): out = 'pudgy'; break; default: out = 'flabby'; break; } return out; }, 'health' : function(CHAR) { return "<span class='disabled'>[HEALTH]</span>"; }, 'fitness' : function(CHAR) { return "<span class='disabled'>[FITNESS]</span>"; }, 'back' : function(CHAR) { var out = ''; var size = (CHAR.BODY.Traps.train+CHAR.BODY.LoBack.train)/2; /* 13 levels */ switch(true) { case (size > 18.0): out = 'freakish'; break; case (size > 16.0): out = 'monstrous'; break; case (size > 14.0): out = 'enormous'; break; case (size > 12.0): out = 'bulky'; break; case (size > 10.0): out = 'massive'; break; case (size > 8.0): out = 'huge'; break; case (size > 7.0): out = 'thick'; break; case (size > 6.0): out = 'solid'; break; case (size > 5.0): out = 'prominent'; break; case (size > 4.0): out = 'firm'; break; case (size > 3.0): out = 'modest'; break; case (size > 2.0): out = 'slim'; break; default: out = 'tiny'; break; } return out; }, 'shoulders' : function(CHAR) { var out = ''; var size = (CHAR.BODY.Traps.train+CHAR.BODY.Delts.train)/2; /* 13 levels */ switch(true) { case (size > 18.0): out = 'freakish'; break; case (size > 16.0): out = 'monstrous'; break; case (size > 14.0): out = 'enormous'; break; case (size > 12.0): out = 'bulky'; break; case (size > 10.0): out = 'massive'; break; case (size > 8.0): out = 'huge'; break; case (size > 7.0): out = 'thick'; break; case (size > 6.0): out = 'solid'; break; case (size > 5.0): out = 'prominent'; break; case (size > 4.0): out = 'firm'; break; case (size > 3.0): out = 'modest'; break; case (size > 2.0): out = 'slim'; break; default: out = 'tiny'; break; } return out; }, 'from_behind' : function(CHAR) { var out = ''; var size = (CHAR.BODY.Traps.train+CHAR.BODY.Lats.train)/2; /* 13 levels */ switch(true) { case (size > 18.0): out = 'monstrous'; break; case (size > 16.0): out = 'freakish'; break; case (size > 14.0): out = 'massive'; break; case (size > 12.0): out = 'gigantic'; break; case (size > 10.0): out = 'enormous'; break; case (size > 8.0): out = 'frightening'; break; case (size > 7.0): out = 'huge'; break; case (size > 6.0): out = 'dominant'; break; case (size > 5.0): out = 'solid'; break; case (size > 4.0): out = 'small'; break; case (size > 3.0): out = 'little'; break; case (size > 2.0): out = 'harmless'; break; default: out = 'tiny'; break; } return out; }, /* 'xxxx' : function(CHAR) {}, */ }>>
<<set setup.FLAGS={ 'DISPLAY':{ 'base_metrics' : false, }, }>>
<<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<run setup.ALIAS.doRest('sleep', 120/60, $G.PC); >> <<run setup.ALIAS.giveFeedback("You take a short nap to recover your strength.");>> <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>>
<<set setup.NAMES={ 'randomAge' : function(min, max) { min=min||14; max=max||89; /* take the lower of X averages of X; X=[1..5], should generate realistic age frequencies, tending toward the lower-middle range, while still allowing the full range */ var roll = 0.1; var rolls = either(1,2,2,3,3,3,4,4,5,-4,-3,-2); switch(rolls) { case 1: roll = Math.min( (Math.random())/1 ); break; case 2: roll = Math.min( (Math.random()+Math.random())/2, (Math.random()+Math.random())/2 ); break; case 3: roll = Math.min( (Math.random()+Math.random()+Math.random())/3, (Math.random()+Math.random()+Math.random())/3, (Math.random()+Math.random()+Math.random())/3 ); break; case 4: roll = Math.min( (Math.random()+Math.random()+Math.random()+Math.random())/4, (Math.random()+Math.random()+Math.random()+Math.random())/4, (Math.random()+Math.random()+Math.random()+Math.random())/4, (Math.random()+Math.random()+Math.random()+Math.random())/4 ); break; case 5: roll = Math.min( (Math.random()+Math.random()+Math.random()+Math.random()+Math.random())/5, (Math.random()+Math.random()+Math.random()+Math.random()+Math.random())/5, (Math.random()+Math.random()+Math.random()+Math.random()+Math.random())/5, (Math.random()+Math.random()+Math.random()+Math.random()+Math.random())/5, (Math.random()+Math.random()+Math.random()+Math.random()+Math.random())/5 ); break; case -2: roll = Math.min(Math.random(), Math.random() ); break; case -3: roll = Math.min(Math.random(), Math.random(), Math.random() ); break; case -4: roll = Math.min(Math.random(), Math.random(), Math.random(), Math.random() ); break; } return Math.round(roll*(max-min)+min); }, 'randomHeight' : function(base, variance) { base=base||69; variance=variance||36; /* 8x, take the lowest, should generate realistic height frequencies, tending toward the base height */ var roll = Math.min(Math.random(), Math.random(), Math.random(), Math.random(), Math.random(), Math.random(), Math.random(), Math.random()); return Math.round((roll*(variance*either(1,-1)))+base); }, 'randomWeight' : function(min, max) { min=min||90; max=max||420; /* 8x, take the lowest, should generate realistic weight frequencies, tending toward the lower-range */ var roll = Math.min(Math.random(), Math.random(), Math.random(), Math.random(), Math.random(), Math.random(), Math.random(), Math.random()); return Math.round(roll*(max-min)+min); }, 'randomBust' : function(min, max) { min=min||-1; max=max||9; /* average of the 3 lowest of 3, should generate realistic bust frequencies, tending toward the lower-middle range */ var roll1 = Math.min(Math.random(), Math.random(), Math.random()); var roll2 = Math.min(Math.random(), Math.random(), Math.random()); var roll3 = Math.min(Math.random(), Math.random(), Math.random()); var roll = (roll1+roll2+roll3+Math.random())/4; return Math.round(roll*(max-min)+min)-1; }, 'randomName' : function(gender, allowMI) { gender=gender||either('male','female'); if(typeof allowMI==='undefined') { allowMI=either(true,false); } var middle = setup.NAMES.randomMiddle(gender, allowMI); return setup.NAMES.randomFirst(gender) + (middle ? ' '+middle : '') +' '+ setup.NAMES.randomLast(); }, 'randomFirst' : function(gender) { gender=gender||either('male','female'); if(gender=='male') { return setup.NAMES.randomBoy(); } else if(gender=='female') { return setup.NAMES.randomGirl(); } }, 'randomMiddle' : function(gender, allowMI) { gender=gender||either('male','female'); if(Math.random()<0.42) { return null; } else if(allowMI && Math.random()<0.58) { return setup.NAMES.randomMI(); } else if(gender=='male') { return setup.NAMES.randomBoy(); } else if(gender=='female') { return setup.NAMES.randomGirl(); } }, 'randomMI' : function() { return String.fromCharCode(Math.floor(Math.random() * 26) + 65); }, 'randomBoy' : function() { return either( 'Aaron', 'Abdul', 'Abe', 'Abel', 'Abraham', 'Abram', 'Adalberto', 'Adam', 'Adan', 'Adolfo', 'Adolph', 'Adrian', 'Agustin', 'Ahmad', 'Ahmed', 'Al', 'Alan', 'Albert', 'Alberto', 'Alden', 'Aldo', 'Alec', 'Alejandro', 'Alex', 'Alexander', 'Alexi', 'Alfonso', 'Alfonzo', 'Alfred', 'Alfredo', 'Ali', 'Allan', 'Allen', 'Alonso', 'Alonzo', 'Alphonse', 'Alphonso', 'Alton', 'Alva', 'Alvaro', 'Alvin', 'Amado', 'Ambrose', 'Amos', 'Anderson', 'Andre', 'Andreas', 'Andres', 'Andrew', 'Andy', 'Angel', 'Angelo', 'Agnus', 'Anthony', 'Antione', 'Antoine', 'Anton', 'Antone', 'Antonio', 'Antony', 'Antwan', 'Archie', 'Arden', 'Armand', 'Armando', 'Arnold', 'Arnoldo', 'Arnulfo', 'Aron', 'Arron', 'Art', 'Arthur', 'Arturo', 'Asa', 'Ashley', 'Aubrey', 'August', 'Augustine', 'Augustus', 'Aurelio', 'Austin', 'Avery', 'Barney', 'Barrett', 'Barry', 'Bart', 'Barton', 'Basil', 'Beau', 'Ben', 'Benedict', 'Benito', 'Benjamin', 'Bennett', 'Bennie', 'Benny', 'Benton', 'Bernard', 'Bernardo', 'Bernie', 'Berry', 'Bert', 'Bertram', 'Bill', 'Billy', 'Blaine', 'Blair', 'Blake', 'Bo', 'Bob', 'Bobbie', 'Bobby', 'Booker', 'Boris', 'Boyce', 'Boyd', 'Brad', 'Bradford', 'Bradley', 'Bradly', 'Brady', 'Branden', 'Brandon', 'Brant', 'Brendan', 'Brendon', 'Brent', 'Brenton', 'Bret', 'Brett', 'Brian', 'Brice', 'Britt', 'Brock', 'Broderick', 'Bruce', 'Bruno', 'Bryan', 'Bryant', 'Bryce', 'Buck', 'Bud', 'Buddy', 'Buford', 'Burl', 'Burt', 'Burton', 'Buster', 'Byron', 'Caleb', 'Calvin', 'Cameron', 'Carey', 'Carl', 'Carlo', 'Carlos', 'Carlton', 'Carmelo', 'Carson', 'Carter', 'Cary', 'Casey', 'Cecil', 'Cedric', 'Cedrick', 'Cesar', 'Chad', 'Chadwick', 'Chance', 'Chang', 'Charles', 'Charley', 'Charlie', 'Chas', 'Chase', 'Chauncey', 'Chester', 'Chet', 'Chi', 'Chong', 'Chris', 'Christian', 'Christoper', 'Christopher', 'Chuck', 'Chung', 'Clarence', 'Clark', 'Claud', 'Claude', 'Claudio', 'Clay', 'Clayton', 'Clement', 'Clemente', 'Cleo', 'Cletus', 'Cleveland', 'Cliff', 'Clifford', 'Clifton', 'Clint', 'Clinton', 'Clyde', 'Cody', 'Colby', 'Cole', 'Coleman', 'Colin', 'Collin', 'Colton', 'Columbus', 'Conrad', 'Cordell', 'Corey', 'Cornelius', 'Cornell', 'Cortez', 'Cory', 'Coy', 'Craig', 'Cristopher', 'Cruz', 'Curt', 'Curtis', 'Cyrus', 'Dale', 'Dallas', 'Dalton', 'Damian', 'Damien', 'Damion', 'Damon', 'Dan', 'Dana', 'Dane', 'Danial', 'Daniel', 'Danilo', 'Dannie', 'Danny', 'Dante', 'Darell', 'Daren', 'Darin', 'Dario', 'Darius', 'Darnell', 'Daron', 'Darrel', 'Darrell', 'Darren', 'Darrick', 'Darrin', 'Darron', 'Darryl', 'Darwin', 'Dave', 'David', 'Davis', 'Dean', 'Deandre', 'Deangelo', 'Dee', 'Del', 'Delbert', 'Delmar', 'Delmer', 'Demarcus', 'Demetrius', 'Denis', 'Dennis', 'Denny', 'Denver', 'Deon', 'Derek', 'Derick', 'Derrick', 'Deshawn', 'Desmond', 'Devin', 'Devon', 'Dewayne', 'Dewey', 'Dewitt', 'Dexter', 'Dick', 'Diego', 'Dillon', 'Dino', 'Dion', 'Dirk', 'Domenic', 'Domingo', 'Dominic', 'Dominick', 'Don', 'Donald', 'Dong', 'Donn', 'Donnell', 'Donnie', 'Donny', 'Donovan', 'Donte', 'Dorian', 'Dorsey', 'Doug', 'Douglas', 'Douglass', 'Doyle', 'Drew', 'Duane', 'Dudley', 'Duncan', 'Dustin', 'Dusty', 'Dwain', 'Dwayne', 'Dwight', 'Dylan', 'Earl', 'Earle', 'Earnest', 'Ed', 'Eddie', 'Eddy', 'Edgar', 'Edgardo', 'Edison', 'Edmond', 'Edmund', 'Edmundo', 'Eduardo', 'Edward', 'Edwardo', 'Edwin', 'Efrain', 'Efren', 'Elbert', 'Elden', 'Eldon', 'Eldridge', 'Eli', 'Elias', 'Elijah', 'Eliseo', 'Elliot', 'Elliott', 'Ellis', 'Ellsworth', 'Elmer', 'Elmo', 'Eloy', 'Elroy', 'Elton', 'Elvin', 'Elvis', 'Elwood', 'Emanuel', 'Emerson', 'Emery', 'Emil', 'Emile', 'Emilio', 'Emmanuel', 'Emmett', 'Emmitt', 'Emory', 'Enoch', 'Enrique', 'Erasmo', 'Eric', 'Erich', 'Erick', 'Erik', 'Ernest', 'Ernesto', 'Ernie', 'Errol', 'Ervin', 'Erwin', 'Esteban', 'Ethan', 'Eugene', 'Eugenio', 'Eusebio', 'Evan', 'Everett', 'Everette', 'Ewan', 'Ezekiel', 'Ezequiel', 'Fabian', 'Faustino', 'Fausto', 'Federico', 'Felipe', 'Felix', 'Felton', 'Ferdinand', 'Fermin', 'Fernando', 'Fidel', 'Filiberto', 'Fitz', 'Fitzgerald', 'Fletcher', 'Florencio', 'Florentino', 'Floyd', 'Forest', 'Forrest', 'Foster', 'Francesco', 'Francis', 'Francisco', 'Frank', 'Franky', 'Franklin', 'Franklyn', 'Fred', 'Freddie', 'Freddy', 'Frederic', 'Frederick', 'Fredric', 'Fredrick', 'Freeman', 'Fritz', 'Gabriel', 'Galen', 'Garfield', 'Garland', 'Garret', 'Garrett', 'Garry', 'Garth', 'Gary', 'Gaston', 'Gavin', 'Genaro', 'Gene', 'Geoffrey', 'George', 'Gerald', 'Geraldo', 'Gerard', 'Gerardo', 'German', 'Gerry', 'Gil', 'Gilbert', 'Gilberto', 'Gino', 'Giovanni', 'Giuseppe', 'Glen', 'Glenn', 'Gonzalo', 'Gordon', 'Grady', 'Graham', 'Graig', 'Grant', 'Granville', 'Greg', 'Gregg', 'Gregorio', 'Gregory', 'Grover', 'Guillermo', 'Gus', 'Gustavo', 'Guy', 'Hai', 'Hal', 'Hank', 'Hans', 'Harlan', 'Harland', 'Harley', 'Harold', 'Harris', 'Harrison', 'Harry', 'Harvey', 'Hassan', 'Hayden', 'Haywood', 'Heath', 'Hector', 'Henry', 'Herb', 'Herbert', 'Heriberto', 'Herman', 'Herschel', 'Hershel', 'Hilario', 'Hilton', 'Hipolito', 'Hiram', 'Hobert', 'Hollis', 'Homer', 'Hong', 'Horace', 'Horacio', 'Hosea', 'Houston', 'Howard', 'Hoyt', 'Hubert', 'Huey', 'Hugh', 'Hugo', 'Humberto', 'Hung', 'Hunter', 'Hyman', 'Ian', 'Ignacio', 'Ike', 'Ira', 'Irvin', 'Irving', 'Irwin', 'Isaac', 'Isaiah', 'Isaias', 'Isiah', 'Isidro', 'Ismael', 'Israel', 'Isreal', 'Issac', 'Ivan', 'Jacinto', 'Jack', 'Jackson', 'Jacob', 'Jacques', 'Jae', 'Jaime', 'Jake', 'Jamaal', 'Jamal', 'Jamar', 'Jame', 'Jamel', 'James', 'Jamey', 'Jamie', 'Jamison', 'Jan', 'Jared', 'Jarod', 'Jarred', 'Jarrett', 'Jarrod', 'Jarvis', 'Jason', 'Jasper', 'Javier', 'Jay', 'Jayne', 'Jayson', 'Jean', 'Jed', 'Jeff', 'Jefferey', 'Jefferson', 'Jeffery', 'Jeffrey', 'Jeffry', 'Jerald', 'Jeramy', 'Jere', 'Jeremiah', 'Jeremy', 'Jermaine', 'Jerold', 'Jerome', 'Jeromy', 'Jerrell', 'Jerrod', 'Jerrold', 'Jerry', 'Jess', 'Jesse', 'Jessie', 'Jesus', 'Jim', 'Jimmie', 'Jimmy', 'Joaquin', 'Joe', 'Joel', 'Joesph', 'Joey', 'John', 'Johnathan', 'Johnathon', 'Johnny', 'Johnson', 'Jon', 'Jonah', 'Jonas', 'Jonathan', 'Jonathon', 'Jordan', 'Jordon', 'Jorge', 'Jose', 'Joseph', 'Josh', 'Joshua', 'Josiah', 'Josue', 'Juan', 'Jude', 'Judson', 'Jules', 'Julian', 'Julio', 'Julius', 'Junior', 'Justin', 'Kareem', 'Karl', 'Kasey', 'Keenan', 'Keith', 'Kelley', 'Kelly', 'Kelvin', 'Ken', 'Kendall', 'Kendrick', 'Keneth', 'Kenneth', 'Kennith', 'Kenny', 'Kent', 'Kenton', 'Kermit', 'Kerry', 'Keven', 'Kevin', 'Kieth', 'King', 'Kip', 'Kirby', 'Kirk', 'Korey', 'Kory', 'Kraig', 'Kris', 'Kristofer', 'Kristopher', 'Kurt', 'Kurtis', 'Kyle', 'Lamar', 'Lamont', 'Lance', 'Landon', 'Lane', 'Lanny', 'Larry', 'Lauren', 'Laurence', 'Lawerence', 'Lawrence', 'Lazaro', 'Leandro', 'Lee', 'Leif', 'Leigh', 'Leland', 'Lemuel', 'Len', 'Lenard', 'Lenny', 'Leo', 'Leon', 'Leonard', 'Leonardo', 'Leonel', 'Leopoldo', 'Leroy', 'Les', 'Lesley', 'Leslie', 'Lester', 'Levi', 'Lewis', 'Lincoln', 'Lindsay', 'Lindsey', 'Lino', 'Linwood', 'Lionel', 'Lloyd', 'Logan', 'Lon', 'Long', 'Lonnie', 'Lonny', 'Loren', 'Lorenzo', 'Lou', 'Louie', 'Louis', 'Lowell', 'Loyd', 'Lucas', 'Luciano', 'Lucien', 'Lucio', 'Lucius', 'Luigi', 'Luis', 'Luke', 'Luther', 'Lyle', 'Lyman', 'Lyndon', 'Lynn', 'Lynwood', 'Mac', 'Mack', 'Major', 'Malcolm', 'Malcom', 'Malik', 'Manual', 'Manuel', 'Marc', 'Marcel', 'Marcelino', 'Marcellus', 'Marcelo', 'Marco', 'Marcos', 'Marcus', 'Margarito', 'Mariano', 'Mario', 'Marion', 'Mark', 'Markus', 'Marlin', 'Marlon', 'Marquis', 'Marshall', 'Martin', 'Marty', 'Marvin', 'Mason', 'Mathew', 'Matt', 'Matthew', 'Maurice', 'Mauricio', 'Mauro', 'Max', 'Maximo', 'Maxwell', 'Maynard', 'McKinley', 'Mel', 'Melvin', 'Merle', 'Merlin', 'Mervin', 'Micah', 'Michael', 'Michal', 'Michale', 'Micheal', 'Michel', 'Mickey', 'Miguel', 'Mike', 'Mikel', 'Milan', 'Miles', 'Milford', 'Millard', 'Milo', 'Milton', 'Minh', 'Miquel', 'Mitch', 'Mitchel', 'Mitchell', 'Modesto', 'Mohamed', 'Mohammad', 'Mohammed', 'Moises', 'Monroe', 'Monte', 'Monty', 'Morgan', 'Morris', 'Morton', 'Moses', 'Moshe', 'Murray', 'Myles', 'Myron', 'Napoleon', 'Nathan', 'Nathanael', 'Nathanial', 'Nathaniel', 'Neal', 'Ned', 'Neil', 'Nelson', 'Nestor', 'Neville', 'Newton', 'Nicholas', 'Nick', 'Nickolas', 'Nicky', 'Nicolas', 'Nigel', 'Noah', 'Noble', 'Noe', 'Noel', 'Nolan', 'Norbert', 'Norberto', 'Norman', 'Normand', 'Norris', 'Octavio', 'Odell', 'Odis', 'Olen', 'Olin', 'Oliver', 'Ollie', 'Omar', 'Omer', 'Oren', 'Orlando', 'Orval', 'Orville', 'Oscar', 'Osvaldo', 'Oswaldo', 'Otha', 'Otis', 'Otto', 'Owen', 'Pablo', 'Palmer', 'Paris', 'Parker', 'Pasquale', 'Pat', 'Patrick', 'Paul', 'Pedro', 'Percy', 'Perry', 'Pete', 'Peter', 'Phil', 'Philip', 'Phillip', 'Pierre', 'Porfirio', 'Porter', 'Preston', 'Prince', 'Quentin', 'Quincy', 'Quinn', 'Quintin', 'Quinton', 'Rafael', 'Raleigh', 'Ralph', 'Ramiro', 'Ramon', 'Randal', 'Randall', 'Randell', 'Randolph', 'Randy', 'Raphael', 'Rashad', 'Raul', 'Ray', 'Rayford', 'Raymon', 'Raymond', 'Raymundo', 'Reed', 'Refugio', 'Reggie', 'Reginald', 'Reid', 'Reinaldo', 'Renaldo', 'Renato', 'Rene', 'Reuben', 'Rex', 'Rey', 'Reyes', 'Reynaldo', 'Rhett', 'Ricardo', 'Rich', 'Richard', 'Richie', 'Rick', 'Rickey', 'Ricky', 'Rico', 'Rigoberto', 'Riley', 'Rob', 'Robby', 'Robert', 'Roberto', 'Robin', 'Robt', 'Rocco', 'Rocky', 'Rod', 'Roderick', 'Rodger', 'Rodney', 'Rodolfo', 'Rodrick', 'Rodrigo', 'Rogelio', 'Roger', 'Roland', 'Rolando', 'Rolf', 'Rolland', 'Roman', 'Romeo', 'Ron', 'Ronald', 'Ronnie', 'Ronny', 'Roosevelt', 'Rory', 'Rosario', 'Roscoe', 'Rosendo', 'Ross', 'Roy', 'Royal', 'Royce', 'Ruben', 'Rubin', 'Rudolf', 'Rudolph', 'Rudy', 'Rueben', 'Rufus', 'Rupert', 'Russ', 'Russel', 'Russell', 'Rusty', 'Ryan', 'Sal', 'Salvador', 'Salvatore', 'Sam', 'Sammie', 'Sammy', 'Samual', 'Samuel', 'Sandy', 'Sanford', 'Sang', 'Santiago', 'Santo', 'Santos', 'Saul', 'Scot', 'Scott', 'Scottie', 'Scotty', 'Sean', 'Sebastian', 'Sergio', 'Seth', 'Seymour', 'Shad', 'Shane', 'Shannon', 'Shaun', 'Shawn', 'Shayne', 'Shelby', 'Sheldon', 'Shelton', 'Sherman', 'Sherwood', 'Shon', 'Sid', 'Sidney', 'Silas', 'Simon', 'Sol', 'Solomon', 'Son', 'Sonny', 'Spencer', 'Stacey', 'Stacy', 'Stan', 'Stanford', 'Stanley', 'Stanton', 'Stefan', 'Stephan', 'Stephen', 'Sterling', 'Steve', 'Steven', 'Stewart', 'Stuart', 'Sung', 'Sydney', 'Sylvester', 'Tad', 'Tanner', 'Taylor', 'Ted', 'Teddy', 'Teodoro', 'Terence', 'Terrance', 'Terrell', 'Terrence', 'Terry', 'Thad', 'Thaddeus', 'Thanh', 'Theo', 'Theodore', 'Theron', 'Thomas', 'Thurman', 'Tim', 'Timmy', 'Timothy', 'Titus', 'Tobias', 'Toby', 'Tod', 'Todd', 'Tom', 'Tomas', 'Tommie', 'Tommy', 'Toney', 'Tony', 'Tory', 'Tracey', 'Tracy', 'Travis', 'Trent', 'Trenton', 'Trevor', 'Trey', 'Trinidad', 'Tristan', 'Troy', 'Truman', 'Tuan', 'Ty', 'Tyler', 'Tyree', 'Tyrell', 'Tyron', 'Tyrone', 'Tyson', 'Urien', 'Ulric', 'Ulysses', 'Val', 'Valentine', 'Van', 'Vance', 'Vaughn', 'Vern', 'Vernon', 'Vicente', 'Victor', 'Vince', 'Vincent', 'Vincenzo', 'Virgil', 'Virgilio', 'Vito', 'Von', 'Wade', 'Waldo', 'Walker', 'Wallace', 'Wally', 'Walter', 'Walton', 'Ward', 'Warner', 'Warren', 'Waylon', 'Wayne', 'Weldon', 'Wendell', 'Werner', 'Wes', 'Wesley', 'Weston', 'Wilber', 'Wilbert', 'Wilbur', 'Wilburn', 'Wiley', 'Wilford', 'Wilfred', 'Wilfredo', 'Will', 'Willard', 'William', 'Willie', 'Willis', 'Willy', 'Wilmer', 'Wilson', 'Wilton', 'Winford', 'Winfred', 'Winston', 'Woodrow', 'Wyatt', 'Xander', 'Xavier', 'Yong', 'Young', 'Yu', 'Zachariah', 'Zachary', 'Zachery', 'Zack', 'Zackary', 'Zane' ); }, 'randomGirl' : function() { return either( 'Abbey', 'Abbie', 'Abby', 'Abigail', 'Ada', 'Adah', 'Adaline', 'Addie', 'Adela', 'Adelaida', 'Adelaide', 'Adele', 'Adelia', 'Adelina', 'Adeline', 'Adell', 'Adella', 'Adelle', 'Adena', 'Adina', 'Adria', 'Adrian', 'Adriana', 'Adriane', 'Adrianna', 'Adrianne', 'Adrien', 'Adriene', 'Adrienne', 'Afton', 'Agatha', 'Agnes', 'Agripina', 'Agueda', 'Agustina', 'Ai', 'Aida', 'Aide', 'Aiko', 'Aileen', 'Ailene', 'Aimee', 'Aisha', 'Aja', 'Akiko', 'Akilah', 'Alaina', 'Alaine', 'Alana', 'Alane', 'Alanna', 'Alayna', 'Alba', 'Alberta', 'Albertha', 'Albertina', 'Albertine', 'Albina', 'Alda', 'Alease', 'Alecia', 'Aleen', 'Aleida', 'Aleisha', 'Alejandra', 'Alejandrina', 'Alena', 'Alene', 'Alesha', 'Aleshia', 'Alesia', 'Alessandra', 'Aleta', 'Aletha', 'Alethea', 'Alethia', 'Alex', 'Alexa', 'Alexandra', 'Alexandria', 'Alexia', 'Alexis', 'Alfreda', 'Alfredia', 'Ali', 'Alia', 'Alica', 'Alice', 'Alicia', 'Alida', 'Alina', 'Aline', 'Alisa', 'Alise', 'Alisha', 'Alishia', 'Alisia', 'Alison', 'Alissa', 'Alita', 'Alix', 'Aliza', 'Alla', 'Alleen', 'Allegra', 'Allena', 'Allene', 'Allie', 'Alline', 'Allison', 'Allyn', 'Allyson', 'Alma', 'Almeda', 'Almeta', 'Alona', 'Alpha', 'Alta', 'Altagracia', 'Altha', 'Althea', 'Alvera', 'Alverta', 'Alvina', 'Alyce', 'Alycia', 'Alysa', 'Alyse', 'Alysha', 'Alysia', 'Alyson', 'Alyssa', 'Amada', 'Amalia', 'Amanda', 'Amber', 'Amberly', 'Amee', 'Amelia', 'America', 'Ami', 'Amie', 'Amiee', 'Amina', 'Amira', 'Ammie', 'Amparo', 'Amy', 'An', 'Ana', 'Anabel', 'Analisa', 'Anamaria', 'Anastacia', 'Anastasia', 'Andera', 'Andra', 'Andrea', 'Andree', 'Andria', 'Andrula', 'Anette', 'Angel', 'Angela', 'Angele', 'Angelena', 'Angeles', 'Angelia', 'Angelic', 'Angelica', 'Angelika', 'Angelina', 'Angeline', 'Angelique', 'Angelita', 'Angella', 'Angelyn', 'Angie', 'Angila', 'Angla', 'Angle', 'Anglea', 'Anh', 'Anika', 'Anisa', 'Anisha', 'Anissa', 'Anita', 'Anitra', 'Anja', 'Anjanette', 'Anjelica', 'Ann', 'Anna', 'Annabel', 'Annabell', 'Annabelle', 'Annalee', 'Annalisa', 'Annamae', 'Annamaria', 'Annamarie', 'Anne', 'Anneliese', 'Annelle', 'Annemarie', 'Annett', 'Annetta', 'Annette', 'Annice', 'Annie', 'Annika', 'Annis', 'Annita', 'Annmarie', 'Antionette', 'Antoinette', 'Antonetta', 'Antonette', 'Antonia', 'Antonietta', 'Antonina', 'Anya', 'Apolonia', 'April', 'Apryl', 'Ara', 'Araceli', 'Aracelis', 'Aracely', 'Arcelia', 'Ardath', 'Ardelia', 'Ardella', 'Ardelle', 'Ardis', 'Ardith', 'Aretha', 'Argelia', 'Argentina', 'Ariana', 'Ariane', 'Arianna', 'Arianne', 'Arica', 'Arie', 'Ariel', 'Arielle', 'Arla', 'Arlean', 'Arleen', 'Arlena', 'Arlene', 'Arletha', 'Arletta', 'Arlette', 'Arlinda', 'Arline', 'Arlyne', 'Armanda', 'Armandina', 'Armida', 'Arminda', 'Arnetta', 'Arnette', 'Arnita', 'Arvilla', 'Asha', 'Ashanti', 'Ashely', 'Ashlea', 'Ashlee', 'Ashleigh', 'Ashley', 'Ashli', 'Ashlie', 'Ashly', 'Ashlyn', 'Ashton', 'Asia', 'Asley', 'Assunta', 'Astrid', 'Asuncion', 'Athena', 'Aubrey', 'Audie', 'Audra', 'Audrea', 'Audrey', 'Audria', 'Audrie', 'Audry', 'Augusta', 'Augustina', 'Augustine', 'Aundrea', 'Aura', 'Aurea', 'Aurelia', 'Aurora', 'Aurore', 'Autumn', 'Ava', 'Avelina', 'Avery', 'Avis', 'Avril', 'Awilda', 'Ayako', 'Ayana', 'Ayanna', 'Ayesha', 'Azalee', 'Azucena', 'Azzie', 'Babara', 'Babette', 'Bailey', 'Bambi', 'Bao', 'Barabara', 'Barb', 'Barbara', 'Barbera', 'Barbie', 'Barbra', 'Bari', 'Barrie', 'Basilia', 'Bea', 'Beata', 'Beatrice', 'Beatris', 'Beatriz', 'Beaulah', 'Bebe', 'Becki', 'Beckie', 'Becky', 'Bee', 'Belen', 'Belia', 'Belinda', 'Belkis', 'Bell', 'Bella', 'Belle', 'Belva', 'Benita', 'Berenice', 'Berna', 'Bernadette', 'Bernadine', 'Bernarda', 'Bernardina', 'Bernardine', 'Berneice', 'Bernetta', 'Bernice', 'Bernita', 'Berry', 'Berta', 'Bertha', 'Bertie', 'Beryl', 'Bess', 'Bessie', 'Beth', 'Bethanie', 'Bethann', 'Bethany', 'Bethel', 'Betsey', 'Betsy', 'Bette', 'Bettie', 'Bettina', 'Betty', 'Bettyann', 'Bettye', 'Beula', 'Beulah', 'Bev', 'Beverlee', 'Beverley', 'Beverly', 'Bianca', 'Bibi', 'Billi', 'Billie', 'Billye', 'Birdie', 'Birgit', 'Blair', 'Blanca', 'Blanch', 'Blanche', 'Blondell', 'Blossom', 'Blythe', 'Bobbi', 'Bok', 'Bong', 'Bonita', 'Bonnie', 'Bonny', 'Branda', 'Brande', 'Brandee', 'Brandi', 'Brandie', 'Brandy', 'Breana', 'Breann', 'Breanna', 'Breanne', 'Bree', 'Brenda', 'Brenna', 'Briana', 'Brianna', 'Brianne', 'Bridget', 'Bridgett', 'Bridgette', 'Brigette', 'Brigid', 'Brigida', 'Brigitte', 'Brinda', 'Britany', 'Britney', 'Britni', 'Britt', 'Britta', 'Brittaney', 'Brittani', 'Brittanie', 'Brittany', 'Britteny', 'Brittney', 'Brittni', 'Brittny', 'Bronwyn', 'Brook', 'Brooke', 'Bruna', 'Brunilda', 'Bryanna', 'Brynn', 'Buena', 'Buffy', 'Bula', 'Bulah', 'Bunny', 'Burma', 'Caitlin', 'Caitlyn', 'Calandra', 'Calista', 'Callie', 'Camelia', 'Camellia', 'Cameron', 'Cami', 'Camie', 'Camila', 'Camilla', 'Camille', 'Cammie', 'Cammy', 'Candace', 'Candance', 'Candelaria', 'Candi', 'Candice', 'Candida', 'Candie', 'Candis', 'Candra', 'Candy', 'Candyce', 'Caprice', 'Cara', 'Caren', 'Carey', 'Cari', 'Caridad', 'Carie', 'Carin', 'Carina', 'Carisa', 'Carissa', 'Carita', 'Carla', 'Carlee', 'Carleen', 'Carlena', 'Carlene', 'Carletta', 'Carley', 'Carli', 'Carlie', 'Carline', 'Carlita', 'Carlota', 'Carlotta', 'Carly', 'Carlyn', 'Carlyne', 'Carma', 'Carman', 'Carmel', 'Carmela', 'Carmelia', 'Carmelina', 'Carmelita', 'Carmella', 'Carmen', 'Carmina', 'Carmon', 'Carol', 'Carola', 'Carolann', 'Carole', 'Carolee', 'Carolin', 'Carolina', 'Caroline', 'Caroll', 'Carolyn', 'Carolyne', 'Carolynn', 'Caron', 'Caroyln', 'Carri', 'Carrie', 'Carrol', 'Carroll', 'Carry', 'Cary', 'Caryl', 'Carylon', 'Caryn', 'Casandra', 'Casey', 'Casie', 'Casimira', 'Cassandra', 'Cassaundra', 'Cassey', 'Cassi', 'Cassidy', 'Cassie', 'Cassondra', 'Cassy', 'Catalina', 'Catarina', 'Caterina', 'Catharine', 'Catherin', 'Catherina', 'Catherine', 'Cathern', 'Catheryn', 'Cathey', 'Cathi', 'Cathie', 'Cathleen', 'Cathrine', 'Cathryn', 'Cathy', 'Catina', 'Catrice', 'Catrina', 'Cayla', 'Cecelia', 'Cecila', 'Cecile', 'Cecilia', 'Cecille', 'Cecily', 'Celena', 'Celesta', 'Celeste', 'Celestina', 'Celestine', 'Celia', 'Celina', 'Celinda', 'Celine', 'Celsa', 'Ceola', 'Chae', 'Chan', 'Chana', 'Chanda', 'Chandra', 'Chanel', 'Chanell', 'Chanelle', 'Chantal', 'Chantay', 'Chante', 'Chantel', 'Chantell', 'Chantelle', 'Chara', 'Charis', 'Charise', 'Charissa', 'Charisse', 'Charita', 'Charity', 'Charla', 'Charleen', 'Charlena', 'Charlene', 'Charlesetta', 'Charlette', 'Charlie', 'Charline', 'Charlott', 'Charlotte', 'Charlsie', 'Charlyn', 'Charmain', 'Charmaine', 'Charolette', 'Chasidy', 'Chasity', 'Chassidy', 'Chastity', 'Chau', 'Chaya', 'Chelsea', 'Chelsey', 'Chelsie', 'Cher', 'Chere', 'Cheree', 'Cherelle', 'Cheri', 'Cherie', 'Cherilyn', 'Cherise', 'Cherish', 'Cherly', 'Cherlyn', 'Cherri', 'Cherrie', 'Cherry', 'Cherryl', 'Chery', 'Cheryl', 'Cheryle', 'Cheryll', 'Cheyenne', 'Chi', 'Chia', 'Chieko', 'Chin', 'China', 'Ching', 'Chiquita', 'Chloe', 'Chris', 'Chrissy', 'Christa', 'Christal', 'Christeen', 'Christel', 'Christen', 'Christena', 'Christene', 'Christi', 'Christia', 'Christiana', 'Christiane', 'Christie', 'Christin', 'Christina', 'Christine', 'Christinia', 'Christy', 'Chrystal', 'Chu', 'Chun', 'Chung', 'Ciara', 'Cicely', 'Ciera', 'Cierra', 'Cinda', 'Cinderella', 'Cindi', 'Cindie', 'Cindy', 'Cinthia', 'Cira', 'Clair', 'Claire', 'Clara', 'Clare', 'Claretha', 'Claretta', 'Claribel', 'Clarice', 'Clarinda', 'Clarine', 'Claris', 'Clarisa', 'Clarissa', 'Clarita', 'Classie', 'Claudette', 'Claudia', 'Claudie', 'Claudine', 'Clelia', 'Clemencia', 'Clementina', 'Clementine', 'Clemmie', 'Cleo', 'Cleopatra', 'Cleora', 'Cleotilde', 'Cleta', 'Clora', 'Clorinda', 'Clotilde', 'Codi', 'Colby', 'Coleen', 'Colene', 'Coletta', 'Colette', 'Colleen', 'Collen', 'Collene', 'Collette', 'Concepcion', 'Conception', 'Concetta', 'Concha', 'Conchita', 'Connie', 'Constance', 'Consuela', 'Consuelo', 'Contessa', 'Cora', 'Coral', 'Coralee', 'Coralie', 'Corazon', 'Cordelia', 'Cordia', 'Cordie', 'Coreen', 'Corene', 'Coretta', 'Cori', 'Corie', 'Corina', 'Corine', 'Corinna', 'Corinne', 'Corliss', 'Cornelia', 'Corrie', 'Corrin', 'Corrina', 'Corrine', 'Corrinne', 'Cortney', 'Courtney', 'Creola', 'Cris', 'Criselda', 'Crissy', 'Crista', 'Cristal', 'Cristen', 'Cristi', 'Cristie', 'Cristin', 'Cristina', 'Cristine', 'Cristy', 'Crysta', 'Crystal', 'Crystle', 'Cuc', 'Cyndi', 'Cyndy', 'Cynthia', 'Cyrstal', 'Cythia', 'Dacia', 'Dagmar', 'Dagny', 'Dahlia', 'Daina', 'Daine', 'Daisey', 'Daisy', 'Dakota', 'Dalene', 'Dalia', 'Dalila', 'Dallas', 'Damaris', 'Dana', 'Danae', 'Danelle', 'Danette', 'Dani', 'Dania', 'Danica', 'Daniel', 'Daniela', 'Daniele', 'Daniell', 'Daniella', 'Danielle', 'Danika', 'Danille', 'Danita', 'Danna', 'Dannette', 'Dannie', 'Dannielle', 'Danuta', 'Danyel', 'Danyell', 'Danyelle', 'Daphine', 'Daphne', 'Dara', 'Darby', 'Darcey', 'Darci', 'Darcie', 'Darcy', 'Daria', 'Darla', 'Darleen', 'Darlena', 'Darlene', 'Darline', 'Daryl', 'Davida', 'Davina', 'Dawn', 'Dawna', 'Dawne', 'Dayle', 'Dayna', 'Daysi', 'Deadra', 'Deana', 'Deandra', 'Deandrea', 'Deane', 'Deann', 'Deanna', 'Deanne', 'Deb', 'Debbi', 'Debbie', 'Debbra', 'Debby', 'Debera', 'Debi', 'Debora', 'Deborah', 'Debra', 'Debrah', 'Debroah', 'Dede', 'Dedra', 'Dee', 'Deeann', 'Deeanna', 'Deedee', 'Deedra', 'Deena', 'Deetta', 'Deidra', 'Deidre', 'Deirdre', 'Deja', 'Delaine', 'Delana', 'Delcie', 'Delena', 'Delfina', 'Delia', 'Delicia', 'Delila', 'Delilah', 'Delinda', 'Delisa', 'Dell', 'Della', 'Delma', 'Delmy', 'Delois', 'Deloise', 'Delora', 'Deloras', 'Delores', 'Deloris', 'Delorse', 'Delpha', 'Delphia', 'Delphine', 'Delsie', 'Delta', 'Demetra', 'Demetria', 'Demetrice', 'Dena', 'Denae', 'Deneen', 'Denese', 'Denice', 'Denise', 'Denisha', 'Denisse', 'Denita', 'Denna', 'Dennise', 'Denny', 'Denyse', 'Deonna', 'Desirae', 'Desire', 'Desiree', 'Despina', 'Dessie', 'Destiny', 'Detra', 'Devon', 'Devona', 'Devora', 'Devorah', 'Dia', 'Diamond', 'Dian', 'Diana', 'Diane', 'Diann', 'Dianna', 'Dianne', 'Diedra', 'Diedre', 'Dierdre', 'Digna', 'Dimple', 'Dina', 'Dinah', 'Dinorah', 'Dione', 'Dionna', 'Dionne', 'Divina', 'Dixie', 'Dodie', 'Dollie', 'Dolly', 'Dolores', 'Doloris', 'Domenica', 'Dominga', 'Dominica', 'Dominique', 'Dominque', 'Domitila', 'Domonique', 'Dona', 'Donella', 'Donetta', 'Donette', 'Donita', 'Donna', 'Donnetta', 'Donnette', 'Donya', 'Dora', 'Dorathy', 'Dorcas', 'Doreatha', 'Doreen', 'Dorene', 'Doretha', 'Dorethea', 'Doretta', 'Dori', 'Doria', 'Dorie', 'Dorinda', 'Dorine', 'Doris', 'Dorla', 'Dorotha', 'Dorothea', 'Dorothy', 'Dorris', 'Dortha', 'Dorthea', 'Dorthey', 'Dorthy', 'Dot', 'Dottie', 'Dotty', 'Dovie', 'Dreama', 'Drema', 'Drew', 'Drucilla', 'Drusilla', 'Dulce', 'Dulcie', 'Dusti', 'Dwana', 'Dyan', 'Earlean', 'Earleen', 'Earlene', 'Earlie', 'Earline', 'Earnestine', 'Eartha', 'Easter', 'Eboni', 'Ebonie', 'Ebony', 'Echo', 'Eda', 'Edda', 'Eddie', 'Edelmira', 'Eden', 'Edie', 'Edith', 'Edna', 'Edra', 'Edris', 'Edwina', 'Edyth', 'Edythe', 'Effie', 'Eileen', 'Eilene', 'Ela', 'Eladia', 'Elaina', 'Elaine', 'Elana', 'Elane', 'Elanor', 'Elayne', 'Elba', 'Elda', 'Eldora', 'Eleanor', 'Eleanora', 'Eleanore', 'Elease', 'Elena', 'Elene', 'Eleni', 'Elenor', 'Elenora', 'Elenore', 'Eleonor', 'Eleonora', 'Eleonore', 'Elfreda', 'Elfrieda', 'Elfriede', 'Elia', 'Eliana', 'Elicia', 'Elida', 'Elidia', 'Elin', 'Elina', 'Elinor', 'Elinore', 'Elisa', 'Elisabeth', 'Elise', 'Elisha', 'Elissa', 'Eliz', 'Eliza', 'Elizabet', 'Elizabeth', 'Elizbeth', 'Elizebeth', 'Elke', 'Ella', 'Ellamae', 'Ellan', 'Ellen', 'Ellena', 'Elli', 'Ellie', 'Elly', 'Ellyn', 'Elma', 'Elmira', 'Elna', 'Elnora', 'Elodia', 'Elois', 'Eloisa', 'Eloise', 'Elouise', 'Elsa', 'Else', 'Elsie', 'Elsy', 'Elva', 'Elvera', 'Elvia', 'Elvie', 'Elvina', 'Elvira', 'Elwanda', 'Elyse', 'Elza', 'Ema', 'Emelda', 'Emelia', 'Emelina', 'Emeline', 'Emely', 'Emerald', 'Emerita', 'Emiko', 'Emilee', 'Emilia', 'Emilie', 'Emily', 'Emma', 'Emmaline', 'Emmie', 'Emmy', 'Emogene', 'Ena', 'Enda', 'Enedina', 'Eneida', 'Enid', 'Enola', 'Enriqueta', 'Epifania', 'Era', 'Erica', 'Ericka', 'Erika', 'Erin', 'Erinn', 'Erlene', 'Erlinda', 'Erline', 'Erma', 'Ermelinda', 'Erminia', 'Erna', 'Ernestina', 'Ernestine', 'Eryn', 'Esmeralda', 'Esperanza', 'Essie', 'Esta', 'Estefana', 'Estela', 'Estell', 'Estella', 'Estelle', 'Ester', 'Esther', 'Estrella', 'Etha', 'Ethel', 'Ethelene', 'Ethelyn', 'Ethyl', 'Etsuko', 'Etta', 'Ettie', 'Eufemia', 'Eugena', 'Eugenia', 'Eugenie', 'Eula', 'Eulah', 'Eulalia', 'Eun', 'Euna', 'Eunice', 'Eura', 'Eusebia', 'Eustolia', 'Eva', 'Evalyn', 'Evangelina', 'Evangeline', 'Eve', 'Evelia', 'Evelin', 'Evelina', 'Eveline', 'Evelyn', 'Evelyne', 'Evelynn', 'Evette', 'Evia', 'Evie', 'Evita', 'Evon', 'Evonne', 'Ewa', 'Exie', 'Fabiola', 'Fae', 'Fairy', 'Faith', 'Fallon', 'Fannie', 'Fanny', 'Farah', 'Farrah', 'Fatima', 'Fatimah', 'Faustina', 'Faviola', 'Fawn', 'Fay', 'Faye', 'Fe', 'Felecia', 'Felica', 'Felice', 'Felicia', 'Felicidad', 'Felicita', 'Felicitas', 'Felipa', 'Felisa', 'Felisha', 'Fermina', 'Fern', 'Fernanda', 'Fernande', 'Ferne', 'Fidela', 'Fidelia', 'Filomena', 'Fiona', 'Flavia', 'Fleta', 'Flo', 'Flor', 'Flora', 'Florance', 'Florence', 'Florencia', 'Florene', 'Florentina', 'Floretta', 'Floria', 'Florida', 'Florinda', 'Florine', 'Florrie', 'Flossie', 'Floy', 'Fonda', 'Fran', 'Francene', 'Frances', 'Francesca', 'Franchesca', 'Francie', 'Francina', 'Francine', 'Francisca', 'Francoise', 'Frankie', 'Fransisca', 'Freda', 'Fredda', 'Freddie', 'Frederica', 'Fredericka', 'Fredia', 'Fredricka', 'Freeda', 'Freida', 'Frida', 'Frieda', 'Fumiko', 'Gabriela', 'Gabriele', 'Gabriella', 'Gabrielle', 'Gabby', 'Gail', 'Gala', 'Gale', 'Galina', 'Garnet', 'Garnett', 'Gaye', 'Gayla', 'Gayle', 'Gaylene', 'Gaynell', 'Gaynelle', 'Gearldine', 'Gema', 'Gemma', 'Gena', 'Genesis', 'Geneva', 'Genevie', 'Genevieve', 'Genevive', 'Genia', 'Genie', 'Genna', 'Gennie', 'Genny', 'Genoveva', 'Georgann', 'Georgeann', 'Georgeanna', 'Georgene', 'Georgetta', 'Georgette', 'Georgia', 'Georgiana', 'Georgiann', 'Georgianna', 'Georgianne', 'Georgie', 'Georgina', 'Georgine', 'Geraldine', 'Geralyn', 'Gerda', 'Geri', 'Germaine', 'Gerri', 'Gertha', 'Gertie', 'Gertrud', 'Gertrude', 'Gertrudis', 'Gertude', 'Ghislaine', 'Gia', 'Gianna', 'Gidget', 'Gigi', 'Gilberte', 'Gilda', 'Gillian', 'Gilma', 'Gina', 'Ginette', 'Ginger', 'Ginny', 'Giovanna', 'Gisela', 'Gisele', 'Giselle', 'Gita', 'Giuseppina', 'Gladis', 'Glady', 'Gladys', 'Glayds', 'Glenda', 'Glendora', 'Glenna', 'Glennie', 'Glennis', 'Glinda', 'Gloria', 'Glory', 'Glynda', 'Glynis', 'Golda', 'Golden', 'Goldie', 'Grace', 'Gracia', 'Gracie', 'Graciela', 'Grayce', 'Grazyna', 'Gregoria', 'Greta', 'Gretchen', 'Gretta', 'Gricelda', 'Grisel', 'Griselda', 'Guadalupe', 'Gudrun', 'Guillermina', 'Gussie', 'Gwen', 'Gwenda', 'Gwendolyn', 'Gwenn', 'Gwyn', 'Gwyneth', 'Ha', 'Hae', 'Hailey', 'Haley', 'Halina', 'Halley', 'Hallie', 'Han', 'Hana', 'Hang', 'Hanh', 'Hanna', 'Hannah', 'Hannelore', 'Harmony', 'Harriet', 'Harriett', 'Harriette', 'Hassie', 'Hattie', 'Haydee', 'Hayden', 'Hayley', 'Hazel', 'Heather', 'Hedy', 'Hee', 'Heide', 'Heidi', 'Heidy', 'Heike', 'Helaine', 'Helen', 'Helena', 'Helene', 'Helga', 'Hellen', 'Henrietta', 'Henriette', 'Herlinda', 'Herma', 'Hermelinda', 'Hermila', 'Hermina', 'Hermine', 'Herminia', 'Herta', 'Hertha', 'Hester', 'Hettie', 'Hiedi', 'Hien', 'Hilaria', 'Hilary', 'Hilda', 'Hilde', 'Hildegard', 'Hildegarde', 'Hildred', 'Hillary', 'Hilma', 'Hiroko', 'Hisako', 'Hoa', 'Holley', 'Holli', 'Hollie', 'Holly', 'Honey', 'Hope', 'Hortencia', 'Hortense', 'Hortensia', 'Hsiu', 'Hue', 'Hui', 'Hulda', 'Huong', 'Hwa', 'Hyacinth', 'Hye', 'Hyo', 'Hyon', 'Hyun', 'Ida', 'Idalia', 'Idell', 'Idella', 'Iesha', 'Ignacia', 'Ila', 'Ilana', 'Ilda', 'Ileana', 'Ileen', 'Ilene', 'Iliana', 'Illa', 'Ilona', 'Ilse', 'Iluminada', 'Ima', 'Imelda', 'Imogene', 'In', 'Ina', 'India', 'Indira', 'Inell', 'Ines', 'Inez', 'Inga', 'Inge', 'Ingeborg', 'Inger', 'Ingrid', 'Inocencia', 'Iola', 'Iona', 'Ione', 'Ira', 'Iraida', 'Irena', 'Irene', 'Irina', 'Iris', 'Irish', 'Irma', 'Irmgard', 'Isa', 'Isabel', 'Isabell', 'Isabella', 'Isabelle', 'Isadora', 'Isaura', 'Isela', 'Isidra', 'Isis', 'Isobel', 'Iva', 'Ivana', 'Ivelisse', 'Ivette', 'Ivey', 'Ivonne', 'Ivory', 'Ivy', 'Izetta', 'Izola', 'Ja', 'Jacalyn', 'Jacelyn', 'Jacinda', 'Jacinta', 'Jackeline', 'Jackelyn', 'Jacki', 'Jackie', 'Jacklyn', 'Jackqueline', 'Jaclyn', 'Jacqualine', 'Jacque', 'Jacquelin', 'Jacqueline', 'Jacquelyn', 'Jacquelyne', 'Jacquelynn', 'Jacquetta', 'Jacqui', 'Jacquie', 'Jacquiline', 'Jacquline', 'Jacqulyn', 'Jada', 'Jade', 'Jadwiga', 'Jae', 'Jaime', 'Jaimee', 'Jaimie', 'Jaleesa', 'Jalisa', 'Jama', 'Jame', 'Jamee', 'Jamey', 'Jami', 'Jamie', 'Jamika', 'Jamila', 'Jammie', 'Jana', 'Janae', 'Janay', 'Jane', 'Janean', 'Janee', 'Janeen', 'Janel', 'Janell', 'Janella', 'Janelle', 'Janene', 'Janessa', 'Janet', 'Janeth', 'Janett', 'Janetta', 'Janette', 'Janey', 'Jani', 'Janice', 'Janie', 'Janiece', 'Janina', 'Janine', 'Janis', 'Janise', 'Janita', 'Jann', 'Janna', 'Jannet', 'Jannette', 'Jannie', 'January', 'Janyce', 'Jaqueline', 'Jaquelyn', 'Jasmin', 'Jasmine', 'Jaunita', 'Jae', 'Jaye', 'Jayme', 'Jaymie', 'Jayna', 'Jayne', 'Jazmin', 'Jazmine', 'Jean', 'Jeana', 'Jeane', 'Jeanelle', 'Jeanene', 'Jeanett', 'Jeanetta', 'Jeanette', 'Jeanice', 'Jeanie', 'Jeanine', 'Jeanmarie', 'Jeanna', 'Jeanne', 'Jeannetta', 'Jeannette', 'Jeannie', 'Jeannine', 'Jen', 'Jena', 'Jenae', 'Jene', 'Jenee', 'Jenell', 'Jenelle', 'Jenette', 'Jeneva', 'Jeni', 'Jenice', 'Jenifer', 'Jeniffer', 'Jenine', 'Jenise', 'Jenna', 'Jennefer', 'Jennell', 'Jennette', 'Jenni', 'Jennie', 'Jennifer', 'Jenniffer', 'Jennine', 'Jenny', 'Jeraldine', 'Jeri', 'Jerica', 'Jerilyn', 'Jerlene', 'Jerri', 'Jerrica', 'Jerrie', 'Jesenia', 'Jesica', 'Jesse', 'Jessenia', 'Jessi', 'Jessia', 'Jessica', 'Jessie', 'Jessika', 'Jestine', 'Jetta', 'Jettie', 'Jewel', 'Jewell', 'Ji', 'Jill', 'Jillian', 'Jin', 'Jina', 'Jinny', 'Jo', 'Joan', 'Joana', 'Joane', 'Joanie', 'Joann', 'Joanna', 'Joanne', 'Joannie', 'Joaquina', 'Jocelyn', 'Jodee', 'Jodi', 'Jodie', 'Jody', 'Joella', 'Joelle', 'Joellen', 'Joetta', 'Joette', 'Johana', 'Johanna', 'Johanne', 'Joi', 'Joie', 'Jolanda', 'Joleen', 'Jolene', 'Jolie', 'Joline', 'Jolyn', 'Jolynn', 'Jona', 'Jone', 'Jonell', 'Jonelle', 'Jong', 'Joni', 'Jonie', 'Jonna', 'Jonnie', 'Jordan', 'Josefina', 'Josefine', 'Joselyn', 'Josephina', 'Josephine', 'Josette', 'Josie', 'Joslyn', 'Josphine', 'Jovan', 'Jovita', 'Joy', 'Joya', 'Joyce', 'Joycelyn', 'Joye', 'Juana', 'Juanita', 'Jude', 'Judi', 'Judie', 'Judith', 'Judy', 'Jule', 'Julee', 'Julene', 'Juli', 'Julia', 'Julian', 'Juliana', 'Juliane', 'Juliann', 'Julianna', 'Julianne', 'Julie', 'Julieann', 'Julienne', 'Juliet', 'Julieta', 'Julietta', 'Juliette', 'Julissa', 'June', 'Jung', 'Junie', 'Junita', 'Junko', 'Justa', 'Justina', 'Justine', 'Jutta', 'Ka', 'Kacey', 'Kaci', 'Kacie', 'Kacy', 'Kai', 'Kaila', 'Kaitlin', 'Kaitlyn', 'Kala', 'Kaleigh', 'Kaley', 'Kali', 'Kallie', 'Kalyn', 'Kam', 'Kamala', 'Kami', 'Kamilah', 'Kandace', 'Kandi', 'Kandice', 'Kandis', 'Kandra', 'Kandy', 'Kanesha', 'Kanisha', 'Kara', 'Karan', 'Kareen', 'Karen', 'Karena', 'Karey', 'Kari', 'Karie', 'Karima', 'Karin', 'Karina', 'Karine', 'Karisa', 'Karissa', 'Karla', 'Karleen', 'Karlene', 'Karly', 'Karlyn', 'Karma', 'Karmen', 'Karol', 'Karole', 'Karoline', 'Karolyn', 'Karon', 'Karren', 'Karri', 'Karrie', 'Karry', 'Kary', 'Karyl', 'Karyn', 'Kasandra', 'Kasey', 'Kasha', 'Kasi', 'Kasie', 'Kassandra', 'Kassie', 'Kate', 'Katelin', 'Katelyn', 'Katelynn', 'Katerine', 'Kathaleen', 'Katharina', 'Katharine', 'Katharyn', 'Kathe', 'Katheleen', 'Katherin', 'Katherina', 'Katherine', 'Kathern', 'Katheryn', 'Kathey', 'Kathi', 'Kathie', 'Kathleen', 'Kathlene', 'Kathline', 'Kathlyn', 'Kathrin', 'Kathrine', 'Kathryn', 'Kathryne', 'Kathy', 'Kathyrn', 'Kati', 'Katia', 'Katie', 'Katina', 'Katlyn', 'Katrice', 'Katrina', 'Kattie', 'Katy', 'Kay', 'Kayce', 'Kaycee', 'Kaye', 'Kayla', 'Kaylee', 'Kayleen', 'Kayleigh', 'Kaylene', 'Kazuko', 'Kecia', 'Keeley', 'Keely', 'Keena', 'Keesha', 'Keiko', 'Keila', 'Keira', 'Keisha', 'Keli', 'Kelle', 'Kellee', 'Kelley', 'Kelli', 'Kellie', 'Kelly', 'Kellye', 'Kelsey', 'Kelsi', 'Kelsie', 'Kemberly', 'Kena', 'Kenda', 'Kendra', 'Kenia', 'Kenisha', 'Kenna', 'Kenya', 'Kenyatta', 'Kenyetta', 'Kera', 'Keren', 'Keri', 'Kerri', 'Kerrie', 'Kerry', 'Kerstin', 'Kesha', 'Keshia', 'Keturah', 'Keva', 'Khadijah', 'Khalilah', 'Kia', 'Kiana', 'Kiara', 'Kiera', 'Kiersten', 'Kiesha', 'Kiley', 'Kim', 'Kimber', 'Kimberely', 'Kimberlee', 'Kimberley', 'Kimberli', 'Kimberlie', 'Kimberly', 'Kimbery', 'Kimbra', 'Kimi', 'Kimiko', 'Kina', 'Kindra', 'Kira', 'Kirby', 'Kirsten', 'Kirstie', 'Kirstin', 'Kisha', 'Kit', 'Kittie', 'Kitty', 'Kiyoko', 'Kizzie', 'Kizzy', 'Klara', 'Kori', 'Kortney', 'Kourtney', 'Kris', 'Krishna', 'Krissy', 'Krista', 'Kristal', 'Kristan', 'Kristeen', 'Kristel', 'Kristen', 'Kristi', 'Kristian', 'Kristie', 'Kristin', 'Kristina', 'Kristine', 'Kristle', 'Kristy', 'Kristyn', 'Krysta', 'Krystal', 'Krysten', 'Krystin', 'Krystina', 'Krystle', 'Krystyna', 'Kum', 'Kyla', 'Kylee', 'Kylie', 'Kym', 'Kymberly', 'Kyoko', 'Kyong', 'Kyra', 'Kyung', 'Lacey', 'Lachelle', 'Laci', 'Lacie', 'Lacresha', 'Lacy', 'Ladawn', 'Ladonna', 'Lady', 'Lael', 'Lahoma', 'Lai', 'Laila', 'Laine', 'Lajuana', 'Lakeesha', 'Lakeisha', 'Lakendra', 'Lakenya', 'Lakesha', 'Lakeshia', 'Lakia', 'Lakiesha', 'Lakisha', 'Lakita', 'Lala', 'Lamonica', 'Lan', 'Lana', 'Lane', 'Lanell', 'Lanelle', 'Lanette', 'Lang', 'Lani', 'Lanie', 'Lanita', 'Lannie', 'Lanora', 'Laquanda', 'Laquita', 'Lara', 'Larae', 'Laraine', 'Laree', 'Larhonda', 'Larisa', 'Larissa', 'Larita', 'Laronda', 'Larraine', 'Larue', 'Lasandra', 'Lashanda', 'Lashandra', 'Lashaun', 'Lashaunda', 'Lashawn', 'Lashawna', 'Lashawnda', 'Lashay', 'Lashell', 'Lashon', 'Lashonda', 'Lashunda', 'Lasonya', 'Latanya', 'Latarsha', 'Latasha', 'Latashia', 'Latesha', 'Latia', 'Laticia', 'Latina', 'Latisha', 'Latonia', 'Latonya', 'Latoria', 'Latosha', 'Latoya', 'Latoyia', 'Latrice', 'Latricia', 'Latrina', 'Latrisha', 'Launa', 'Laura', 'Lauralee', 'Lauran', 'Laure', 'Laureen', 'Laurel', 'Lauren', 'Laurena', 'Laurene', 'Lauretta', 'Laurette', 'Lauri', 'Laurice', 'Laurie', 'Laurinda', 'Laurine', 'Lauryn', 'Lavada', 'Lavelle', 'Lavenia', 'Lavera', 'Lavern', 'Laverna', 'Laverne', 'Laveta', 'Lavette', 'Lavina', 'Lavinia', 'Lavon', 'Lavona', 'Lavonda', 'Lavone', 'Lavonia', 'Lavonna', 'Lavonne', 'Lawana', 'Lawanda', 'Lawanna', 'Layla', 'Layne', 'Le', 'Lea', 'Leah', 'Lean', 'Leana', 'Leandra', 'Leann', 'Leanna', 'Leanne', 'Leanora', 'Leatha', 'Leatrice', 'Lecia', 'Leda', 'Lee', 'Leeann', 'Leeanna', 'Leeanne', 'Leena', 'Leesa', 'Leia', 'Leida', 'Leigh', 'Leigha', 'Leighann', 'Leila', 'Leilani', 'Leisa', 'Leisha', 'Lekisha', 'Lela', 'Lelah', 'Lelia', 'Lena', 'Lenita', 'Lenna', 'Lenora', 'Lenore', 'Leola', 'Leoma', 'Leona', 'Leonarda', 'Leonia', 'Leonida', 'Leonie', 'Leonila', 'Leonor', 'Leonora', 'Leonore', 'Leontine', 'Leora', 'Leota', 'Lera', 'Lesa', 'Lesha', 'Lesia', 'Leslee', 'Lesley', 'Lesli', 'Leslie', 'Lessie', 'Leta', 'Letha', 'Leticia', 'Letisha', 'Letitia', 'Lettie', 'Letty', 'Lexie', 'Lezlie', 'Li', 'Lia', 'Liana', 'Liane', 'Lianne', 'Libbie', 'Libby', 'Liberty', 'Librada', 'Lida', 'Lidia', 'Lien', 'Lieselotte', 'Ligia', 'Lila', 'Lili', 'Lilia', 'Lilian', 'Liliana', 'Lilla', 'Lilli', 'Lillia', 'Lilliam', 'Lillian', 'Lilliana', 'Lillie', 'Lilly', 'Lily', 'Lin', 'Lina', 'Linda', 'Lindsay', 'Lindsey', 'Lindsy', 'Lindy', 'Linette', 'Ling', 'Linh', 'Linn', 'Linnea', 'Linnie', 'Linsey', 'Lisa', 'Lisabeth', 'Lisandra', 'Lisbeth', 'Lise', 'Lisette', 'Lisha', 'Lissa', 'Lissette', 'Lita', 'Livia', 'Liz', 'Liza', 'Lizabeth', 'Lizbeth', 'Lizeth', 'Lizette', 'Lizzette', 'Lizzie', 'Loan', 'Loida', 'Lois', 'Loise', 'Lola', 'Lolita', 'Loma', 'Lona', 'Londa', 'Loni', 'Lonna', 'Lonnie', 'Lora', 'Loraine', 'Loralee', 'Lore', 'Lorean', 'Loree', 'Loreen', 'Lorelei', 'Loren', 'Lorena', 'Lorene', 'Lorenza', 'Loreta', 'Loretta', 'Lorette', 'Lori', 'Loria', 'Loriann', 'Lorie', 'Lorilee', 'Lorina', 'Lorinda', 'Lorine', 'Loris', 'Lorita', 'Lorna', 'Lorraine', 'Lorretta', 'Lorri', 'Lorriane', 'Lorrie', 'Lorrine', 'Lory', 'Lottie', 'Louann', 'Louanne', 'Louella', 'Louetta', 'Louisa', 'Louise', 'Loura', 'Lourdes', 'Lourie', 'Louvenia', 'Love', 'Lovella', 'Lovetta', 'Lovie', 'Loyce', 'Lu', 'Luana', 'Luann', 'Luanna', 'Luanne', 'Luba', 'Luci', 'Lucia', 'Luciana', 'Lucie', 'Lucienne', 'Lucila', 'Lucile', 'Lucilla', 'Lucille', 'Lucina', 'Lucinda', 'Lucrecia', 'Lucretia', 'Lucy', 'Ludie', 'Ludivina', 'Lue', 'Luella', 'Luetta', 'Luisa', 'Luise', 'Lula', 'Lulu', 'Luna', 'Lupe', 'Lupita', 'Lura', 'Lurlene', 'Lurline', 'Luvenia', 'Luz', 'Lyda', 'Lydia', 'Lyla', 'Lyn', 'Lynda', 'Lyndia', 'Lyndsay', 'Lyndsey', 'Lynell', 'Lynelle', 'Lynetta', 'Lynette', 'Lynn', 'Lynna', 'Lynne', 'Lynnette', 'Lynsey', 'Ma', 'Mabel', 'Mabelle', 'Mable', 'Machelle', 'Macie', 'Mackenzie', 'Macy', 'Madalene', 'Madaline', 'Madalyn', 'Maddie', 'Madelaine', 'Madeleine', 'Madelene', 'Madeline', 'Madelyn', 'Madge', 'Madie', 'Madison', 'Madlyn', 'Madonna', 'Mae', 'Maegan', 'Mafalda', 'Magali', 'Magaly', 'Magan', 'Magaret', 'Magda', 'Magdalen', 'Magdalena', 'Magdalene', 'Magen', 'Maggie', 'Magnolia', 'Mahalia', 'Mai', 'Maia', 'Maida', 'Maile', 'Maira', 'Maire', 'Maisha', 'Maisie', 'Majorie', 'Makeda', 'Malena', 'Malia', 'Malika', 'Malinda', 'Malisa', 'Malissa', 'Malka', 'Mallie', 'Mallory', 'Malorie', 'Malvina', 'Mamie', 'Mammie', 'Mana', 'Manda', 'Mandi', 'Mandie', 'Mandy', 'Manuela', 'Mao', 'Maple', 'Mara', 'Maragaret', 'Maragret', 'Maranda', 'Marcela', 'Marcelene', 'Marcelina', 'Marceline', 'Marcell', 'Marcella', 'Marcelle', 'Marcene', 'Marchelle', 'Marci', 'Marcia', 'Marcie', 'Marcy', 'Mardell', 'Maren', 'Marg', 'Margaret', 'Margareta', 'Margarete', 'Margarett', 'Margaretta', 'Margarette', 'Margarita', 'Margarite', 'Margart', 'Marge', 'Margene', 'Margeret', 'Margert', 'Margery', 'Marget', 'Margherita', 'Margie', 'Margit', 'Margo', 'Margorie', 'Margot', 'Margret', 'Margrett', 'Marguerita', 'Marguerite', 'Margurite', 'Margy', 'Marhta', 'Mari', 'Maria', 'Mariah', 'Mariam', 'Marian', 'Mariana', 'Marianela', 'Mariann', 'Marianna', 'Marianne', 'Maribel', 'Maribeth', 'Marica', 'Maricela', 'Maricruz', 'Marie', 'Mariel', 'Mariela', 'Mariella', 'Marielle', 'Marietta', 'Mariette', 'Mariko', 'Marilee', 'Marilou', 'Marilu', 'Marilyn', 'Marilynn', 'Marin', 'Marina', 'Marinda', 'Marine', 'Marion', 'Maris', 'Marisa', 'Marisela', 'Marisha', 'Marisol', 'Marissa', 'Marita', 'Maritza', 'Marivel', 'Marjorie', 'Marjory', 'Marketta', 'Markita', 'Marla', 'Marlana', 'Marleen', 'Marlen', 'Marlena', 'Marlene', 'Marline', 'Marlo', 'Marlyn', 'Marlys', 'Marna', 'Marni', 'Marnie', 'Marquerite', 'Marquetta', 'Marquita', 'Marquitta', 'Marry', 'Marsha', 'Marta', 'Marth', 'Martha', 'Marti', 'Martina', 'Martine', 'Marva', 'Marvel', 'Marvella', 'Marvis', 'Marx', 'Mary', 'Marya', 'Maryalice', 'Maryam', 'Maryann', 'Maryanna', 'Maryanne', 'Marybelle', 'Marybeth', 'Maryellen', 'Maryetta', 'Maryjane', 'Maryjo', 'Maryland', 'Marylee', 'Marylin', 'Maryln', 'Marylou', 'Marylouise', 'Marylyn', 'Marylynn', 'Maryrose', 'Masako', 'Matha', 'Mathilda', 'Mathilde', 'Matilda', 'Matilde', 'Mattie', 'Maud', 'Maude', 'Maudie', 'Maura', 'Maureen', 'Maurine', 'Maurita', 'Mavis', 'Maxie', 'Maxima', 'Maximina', 'Maxine', 'May', 'Maya', 'Maybell', 'Maybelle', 'Maye', 'Mayme', 'Mayola', 'Mayra', 'Mazie', 'McKenzie', 'Meagan', 'Meaghan', 'Mechelle', 'Meda', 'Mee', 'Meg', 'Megan', 'Meggan', 'Meghan', 'Meghann', 'Mei', 'Melaine', 'Melani', 'Melania', 'Melanie', 'Melany', 'Melba', 'Melda', 'Melia', 'Melida', 'Melina', 'Melinda', 'Melisa', 'Melissa', 'Melissia', 'Melita', 'Mellie', 'Mellisa', 'Mellissa', 'Melodee', 'Melodi', 'Melodie', 'Melody', 'Melonie', 'Melony', 'Melva', 'Melynda', 'Mendy', 'Mercedes', 'Mercedez', 'Mercy', 'Meredith', 'Meri', 'Merideth', 'Meridith', 'Merilyn', 'Merissa', 'Merlene', 'Merlyn', 'Merna', 'Merri', 'Merrie', 'Merrilee', 'Merrill', 'Merry', 'Mertie', 'Meryl', 'Meta', 'Mi', 'Mia', 'Mica', 'Micaela', 'Micha', 'Michele', 'Michelina', 'Micheline', 'Michelle', 'Michiko', 'Micki', 'Mickie', 'Miesha', 'Migdalia', 'Mignon', 'Miguelina', 'Mika', 'Mikaela', 'Miki', 'Mikki', 'Mila', 'Milagro', 'Milagros', 'Milda', 'Mildred', 'Milissa', 'Millicent', 'Millie', 'Milly', 'Mimi', 'Min', 'Mina', 'Minda', 'Mindi', 'Mindy', 'Minerva', 'Ming', 'Minh', 'Minna', 'Minnie', 'Minta', 'Mira', 'Miranda', 'Mireille', 'Mirella', 'Mireya', 'Miriam', 'Mirian', 'Mirna', 'Mirta', 'Mirtha', 'Misha', 'Miss', 'Missy', 'Misti', 'Mistie', 'Misty', 'Mitsue', 'Mitsuko', 'Mittie', 'Mitzi', 'Mitzie', 'Miyoko', 'Modesta', 'Moira', 'Mollie', 'Molly', 'Mona', 'Monet', 'Monica', 'Monika', 'Monique', 'Monnie', 'Monserrate', 'Moon', 'Mora', 'Morgalla', 'Morgan', 'Morgana', 'Moriah', 'Morrigan', 'Mozell', 'Mozella', 'Mozelle', 'Mui', 'Muoi', 'Muriel', 'My', 'Myesha', 'Myong', 'Myra', 'Myriam', 'Myrl', 'Myrle', 'Myrna', 'Myrta', 'Myrtice', 'Myrtie', 'Myrtis', 'Myrtle', 'Myung', 'Na', 'Nada', 'Nadene', 'Nadia', 'Nadine', 'Naida', 'Nakesha', 'Nakia', 'Nakisha', 'Nakita', 'Nam', 'Nan', 'Nana', 'Nancee', 'Nancey', 'Nanci', 'Nancie', 'Nancy', 'Nanette', 'Nannette', 'Nannie', 'Naoma', 'Naomi', 'Narcisa', 'Natacha', 'Natalia', 'Natalie', 'Natalya', 'Natasha', 'Natashia', 'Nathalie', 'Natisha', 'Natividad', 'Natosha', 'Necole', 'Neda', 'Nedra', 'Neely', 'Neida', 'Nelda', 'Nelia', 'Nelida', 'Nell', 'Nella', 'Nelle', 'Nellie', 'Nelly', 'Nena', 'Nenita', 'Neoma', 'Neomi', 'Nereida', 'Nerissa', 'Nery', 'Neta', 'Nettie', 'Neva', 'Nevada', 'Nga', 'Ngan', 'Ngoc', 'Nguyet', 'Nia', 'Nichelle', 'Nichol', 'Nichole', 'Nicholle', 'Nicki', 'Nickie', 'Nickole', 'Nicol', 'Nicola', 'Nicolasa', 'Nicole', 'Nicolette', 'Nicolle', 'Nida', 'Nidia', 'Niesha', 'Nieves', 'Niki', 'Nikia', 'Nikita', 'Nikki', 'Nikole', 'Nila', 'Nilda', 'Nilsa', 'Nina', 'Ninfa', 'Nisha', 'Nita', 'Nobuko', 'Noel', 'Noelia', 'Noella', 'Noelle', 'Noemi', 'Nohemi', 'Nola', 'Noma', 'Nona', 'Nora', 'Norah', 'Noreen', 'Norene', 'Noriko', 'Norine', 'Norma', 'Nova', 'Novella', 'Nu', 'Nubia', 'Numbers', 'Nydia', 'Nyla', 'Obdulia', 'Ocie', 'Octavia', 'Oda', 'Odelia', 'Odessa', 'Odette', 'Odilia', 'Ofelia', 'Ok', 'Ola', 'Olene', 'Oleta', 'Olevia', 'Olga', 'Olimpia', 'Olinda', 'Oliva', 'Olive', 'Olivia', 'Olympia', 'Oma', 'Omega', 'Ona', 'Oneida', 'Onie', 'Onita', 'Opal', 'Ophelia', 'Ora', 'Oralee', 'Oralia', 'Oretha', 'Orpha', 'Ossie', 'Otelia', 'Otha', 'Otilia', 'Ouida', 'Ozell', 'Ozella', 'Ozie', 'Pa', 'Page', 'Paige', 'Palma', 'Palmira', 'Pam', 'Pamala', 'Pamela', 'Pamelia', 'Pamella', 'Pamila', 'Pamula', 'Pandora', 'Pansy', 'Paola', 'Paris', 'Parthenia', 'Particia', 'Pasty', 'Patience', 'Patria', 'Patrica', 'Patrice', 'Patricia', 'Patrina', 'Patsy', 'Patti', 'Pattie', 'Patty', 'Paula', 'Paulene', 'Pauletta', 'Paulette', 'Paulina', 'Pauline', 'Paulita', 'Paz', 'Pearl', 'Pearle', 'Pearlene', 'Pearlie', 'Pearline', 'Pearly', 'Peg', 'Peggie', 'Peggy', 'Pei', 'Penelope', 'Penney', 'Penni', 'Pennie', 'Penny', 'Perla', 'Petra', 'Petrina', 'Petronila', 'Phebe', 'Phillis', 'Philomena', 'Phoebe', 'Phung', 'Phuong', 'Phylicia', 'Phylis', 'Phyliss', 'Phyllis', 'Pia', 'Piedad', 'Pilar', 'Ping', 'Pinkie', 'Piper', 'Pok', 'Polly', 'Porsche', 'Porsha', 'Portia', 'Precious', 'Pricilla', 'Princess', 'Priscila', 'Priscilla', 'Providencia', 'Prudence', 'Pura', 'Qiana', 'Queen', 'Queenie', 'Quiana', 'Quinn', 'Quyen', 'Rachael', 'Rachal', 'Racheal', 'Rachel', 'Rachele', 'Rachell', 'Rachelle', 'Racquel', 'Rae', 'Raeann', 'Raelene', 'Rafaela', 'Raguel', 'Raina', 'Raisa', 'Ramona', 'Ramonita', 'Rana', 'Ranae', 'Randa', 'Randee', 'Randi', 'Ranee', 'Raquel', 'Rasheeda', 'Rashida', 'Raven', 'Raye', 'Raylene', 'Rayna', 'Rea', 'Reagan', 'Reanna', 'Reatha', 'Reba', 'Rebbeca', 'Rebbecca', 'Rebeca', 'Rebecca', 'Rebecka', 'Rebekah', 'Reda', 'Reena', 'Refugia', 'Regan', 'Regena', 'Regenia', 'Regina', 'Regine', 'Reginia', 'Rei', 'Reiko', 'Reina', 'Reita', 'Rema', 'Remedios', 'Remona', 'Rena', 'Renae', 'Renata', 'Renate', 'Renay', 'Renda', 'Rene', 'Renea', 'Renee', 'Renetta', 'Renita', 'Renna', 'Ressie', 'Reta', 'Retha', 'Retta', 'Reva', 'Reyna', 'Reynalda', 'Rhea', 'Rheba', 'Rhia', 'Rhiannon', 'Rhoda', 'Rhona', 'Rhonda', 'Ria', 'Richelle', 'Ricki', 'Rickie', 'Rikki', 'Rima', 'Rina', 'Risa', 'Rita', 'Riva', 'Rivka', 'Robbi', 'Robbie', 'Robbin', 'Robbyn', 'Robena', 'Roberta', 'Robin', 'Robyn', 'Rochel', 'Rochell', 'Rochelle', 'Rocio', 'Rocki', 'Rocky', 'Rokcy', 'Rolanda', 'Rolande', 'Roma', 'Romaine', 'Romana', 'Romelia', 'Romona', 'Rona', 'Ronda', 'Roni', 'Ronna', 'Ronni', 'Rory', 'Rosa', 'Rosalba', 'Rosalee', 'Rosalia', 'Rosalie', 'Rosalina', 'Rosalind', 'Rosalinda', 'Rosaline', 'Rosalva', 'Rosalyn', 'Rosamaria', 'Rosamond', 'Rosana', 'Rosann', 'Rosanna', 'Rosanne', 'Rosaria', 'Rosaura', 'Rose', 'Roseann', 'Roseanna', 'Roseanne', 'Roselee', 'Roselia', 'Roseline', 'Rosella', 'Roselle', 'Roselyn', 'Rosemarie', 'Rosemary', 'Rosena', 'Rosenda', 'Rosetta', 'Rosette', 'Rosia', 'Rosie', 'Rosina', 'Rosio', 'Rosita', 'Roslyn', 'Rossana', 'Rossie', 'Rosy', 'Rowena', 'Roxana', 'Roxane', 'Roxann', 'Roxanna', 'Roxanne', 'Roxie', 'Roxy', 'Rozanne', 'Rozella', 'Rubi', 'Rubie', 'Ruby', 'Rubye', 'Rufina', 'Ruth', 'Rutha', 'Ruthann', 'Ruthanne', 'Ruthe', 'Ruthie', 'Ryan', 'Ryann', 'Sabina', 'Sabine', 'Sabra', 'Sabrina', 'Sacha', 'Sachiko', 'Sade', 'Sadie', 'Sadye', 'Sage', 'Salena', 'Salina', 'Salley', 'Sallie', 'Sally', 'Salome', 'Sam', 'Samantha', 'Samara', 'Samatha', 'Samella', 'Samira', 'Sammie', 'Sammy', 'Sana', 'Sanda', 'Sandee', 'Sandi', 'Sandie', 'Sandra', 'Sandy', 'Sang', 'Sanjuana', 'Sanjuanita', 'Sanora', 'Santa', 'Sara', 'Sarah', 'Sarai', 'Saran', 'Sari', 'Sarina', 'Sarita', 'Sasha', 'Saturnina', 'Sau', 'Saundra', 'Savanna', 'Savannah', 'Scarlet', 'Scarlett', 'Season', 'Sebrina', 'See', 'Seema', 'Selena', 'Selene', 'Selina', 'Selma', 'Sena', 'Senaida', 'September', 'Serafina', 'Serena', 'Serina', 'Serita', 'Setsuko', 'Sha', 'Shae', 'Shaina', 'Shakia', 'Shakira', 'Shakita', 'Shala', 'Shalanda', 'Shalon', 'Shalonda', 'Shameka', 'Shamika', 'Shan', 'Shana', 'Shanae', 'Shanda', 'Shandi', 'Shandra', 'Shane', 'Shaneka', 'Shanel', 'Shanell', 'Shanelle', 'Shani', 'Shanice', 'Shanika', 'Shaniqua', 'Shanita', 'Shanna', 'Shannan', 'Shannon', 'Shanon', 'Shanta', 'Shantae', 'Shantay', 'Shante', 'Shantel', 'Shantell', 'Shantelle', 'Shanti', 'Shaquana', 'Shaquita', 'Shara', 'Sharan', 'Sharda', 'Sharee', 'Sharell', 'Sharen', 'Shari', 'Sharice', 'Sharie', 'Sharika', 'Sharilyn', 'Sharita', 'Sharla', 'Sharleen', 'Sharlene', 'Sharmaine', 'Sharolyn', 'Sharon', 'Sharonda', 'Sharri', 'Sharron', 'Sharyl', 'Sharyn', 'Shasta', 'Shaun', 'Shauna', 'Shaunda', 'Shaunna', 'Shaunta', 'Shaunte', 'Shavon', 'Shavonda', 'Shavonne', 'Shawana', 'Shawanda', 'Shawanna', 'Shawn', 'Shawna', 'Shawnda', 'Shawnee', 'Shawnna', 'Shawnta', 'Shay', 'Shayla', 'Shayna', 'Shayne', 'Shea', 'Sheba', 'Sheena', 'Sheila', 'Sheilah', 'Shela', 'Shelba', 'Shelby', 'Shelia', 'Shella', 'Shelley', 'Shelli', 'Shellie', 'Shelly', 'Shemeka', 'Shemika', 'Shena', 'Shenika', 'Shenita', 'Shenna', 'Shera', 'Sheree', 'Sherell', 'Sheri', 'Sherice', 'Sheridan', 'Sherie', 'Sherika', 'Sherill', 'Sherilyn', 'Sherise', 'Sherita', 'Sherlene', 'Sherley', 'Sherly', 'Sherlyn', 'Sheron', 'Sherrell', 'Sherri', 'Sherrie', 'Sherril', 'Sherrill', 'Sherron', 'Sherry', 'Sherryl', 'Shery', 'Sheryl', 'Sheryll', 'Shiela', 'Shila', 'Shiloh', 'Shin', 'Shira', 'Shirely', 'Shirl', 'Shirlee', 'Shirleen', 'Shirlene', 'Shirley', 'Shirly', 'Shizue', 'Shizuko', 'Shona', 'Shonda', 'Shondra', 'Shonna', 'Shonta', 'Shoshana', 'Shu', 'Shyla', 'Sibyl', 'Sidney', 'Sierra', 'Signe', 'Sigrid', 'Silva', 'Silvana', 'Silvia', 'Sima', 'Simona', 'Simone', 'Simonne', 'Sina', 'Sindy', 'Siobhan', 'Sirena', 'Siu', 'Sixta', 'Skye', 'Slyvia', 'So', 'Socorro', 'Sofia', 'Soila', 'Sol', 'Solange', 'Soledad', 'Somer', 'Sommer', 'Sona', 'Sondra', 'Song', 'Sonia', 'Sonja', 'Sonya', 'Soo', 'Sook', 'Soon', 'Sophia', 'Sophie', 'Soraya', 'Sparkle', 'Spring', 'Stacee', 'Stacey', 'Staci', 'Stacia', 'Stacie', 'Stacy', 'Star', 'Starla', 'Starr', 'Stasia', 'Stefani', 'Stefania', 'Stefanie', 'Stefany', 'Steffanie', 'Stella', 'Stepanie', 'Stephaine', 'Stephane', 'Stephani', 'Stephania', 'Stephanie', 'Stephany', 'Stephenie', 'Stephine', 'Stephnie', 'Stevie', 'Stormy', 'Su', 'Suanne', 'Sudie', 'Sue', 'Sueann', 'Suellen', 'Suk', 'Sulema', 'Sumiko', 'Summer', 'Sun', 'Sunday', 'Sung', 'Sunni', 'Sunny', 'Sunshine', 'Susan', 'Susana', 'Susann', 'Susanna', 'Susannah', 'Susanne', 'Susie', 'Susy', 'Suzan', 'Suzann', 'Suzanna', 'Suzanne', 'Suzette', 'Suzi', 'Suzie', 'Suzy', 'Svetlana', 'Sybil', 'Syble', 'Sydney', 'Sylvia', 'Sylvie', 'Synthia', 'Syreeta', 'Ta', 'Tabatha', 'Tabetha', 'Tabitha', 'Tai', 'Taina', 'Taisha', 'Tajuana', 'Takako', 'Takisha', 'Talia', 'Talisha', 'Talitha', 'Tam', 'Tama', 'Tamala', 'Tamar', 'Tamara', 'Tamatha', 'Tambra', 'Tameika', 'Tameka', 'Tamekia', 'Tamela', 'Tamera', 'Tamesha', 'Tami', 'Tamica', 'Tamie', 'Tamika', 'Tamiko', 'Tamisha', 'Tammara', 'Tammera', 'Tammi', 'Tammie', 'Tammy', 'Tamra', 'Tana', 'Tandra', 'Tandy', 'Taneka', 'Tanesha', 'Tangela', 'Tania', 'Tanika', 'Tanisha', 'Tanja', 'Tanna', 'Tanya', 'Tara', 'Tarah', 'Taren', 'Tari', 'Tarra', 'Tarsha', 'Taryn', 'Tasha', 'Tashia', 'Tashina', 'Tasia', 'Tatiana', 'Tatum', 'Tatyana', 'Taunya', 'Tawana', 'Tawanda', 'Tawanna', 'Tawna', 'Tawny', 'Tawnya', 'Taylor', 'Tayna', 'Teena', 'Tegan', 'Teisha', 'Telma', 'Temeka', 'Temika', 'Tempie', 'Temple', 'Tena', 'Tenesha', 'Tenisha', 'Tennie', 'Tennille', 'Teodora', 'Teofila', 'Tequila', 'Tera', 'Tereasa', 'Teresa', 'Terese', 'Teresia', 'Teresita', 'Teressa', 'Teri', 'Terica', 'Terina', 'Terisa', 'Terra', 'Terresa', 'Terri', 'Terrie', 'Terrilyn', 'Tesha', 'Tess', 'Tessa', 'Tessie', 'Thalia', 'Thanh', 'Thao', 'Thea', 'Theda', 'Thelma', 'Theodora', 'Theola', 'Theresa', 'Therese', 'Theresia', 'Theressa', 'Thersa', 'Thi', 'Thora', 'Thresa', 'Thu', 'Thuy', 'Thyra', 'Tia', 'Tiana', 'Tianna', 'Tiara', 'Tien', 'Tiera', 'Tierra', 'Tiesha', 'Tifany', 'Tiffaney', 'Tiffani', 'Tiffanie', 'Tiffany', 'Tiffiny', 'Tijuana', 'Tila', 'Tilda', 'Tillie', 'Timika', 'Tina', 'Tinisha', 'Tiny', 'Tisa', 'Tish', 'Tisha', 'Tobi', 'Tobie', 'Toccara', 'Toi', 'Tomasa', 'Tomeka', 'Tomi', 'Tomika', 'Tomiko', 'Tommye', 'Tomoko', 'Tona', 'Tonda', 'Tonette', 'Toni', 'Tonia', 'Tonie', 'Tonisha', 'Tonita', 'Tonja', 'Tonya', 'Tora', 'Tori', 'Torie', 'Torri', 'Torrie', 'Tory', 'Tosha', 'Toshia', 'Toshiko', 'Tova', 'Towanda', 'Toya', 'Tracee', 'Tracey', 'Traci', 'Tracie', 'Tracy', 'Treasa', 'Treena', 'Trena', 'Tresa', 'Tressa', 'Tressie', 'Treva', 'Trevis', 'Tricia', 'Trina', 'Trinh', 'Trinidad', 'Trinity', 'Trish', 'Trisha', 'Trista', 'Trudi', 'Trudie', 'Trudy', 'Trula', 'Truvis', 'Tu', 'Tula', 'Tuyet', 'Twana', 'Twanda', 'Twanna', 'Twila', 'Twyla', 'Tyesha', 'Tyisha', 'Tylene', 'Tynisha', 'Tyra', 'Ula', 'Ulrike', 'Un', 'Una', 'Ursula', 'Usha', 'Ute', 'Vada', 'Val', 'Vala', 'Valarie', 'Valda', 'Valencia', 'Valene', 'Valentina', 'Valeri', 'Valeria', 'Valerie', 'Valery', 'Vallie', 'Valorie', 'Valrie', 'Vanda', 'Vanesa', 'Vanessa', 'Vanetta', 'Vania', 'Vanita', 'Vanna', 'Vannesa', 'Vannessa', 'Vashti', 'Vasiliki', 'Veda', 'Velda', 'Velia', 'Vella', 'Velma', 'Velva', 'Velvet', 'Vena', 'Venessa', 'Venetta', 'Venice', 'Venita', 'Vennie', 'Venus', 'Veola', 'Vera', 'Verda', 'Verdell', 'Verdie', 'Verena', 'Vergie', 'Verla', 'Verlene', 'Verlie', 'Verline', 'Verna', 'Vernell', 'Vernetta', 'Vernia', 'Vernice', 'Vernie', 'Vernita', 'Verona', 'Veronica', 'Veronika', 'Veronique', 'Versie', 'Vertie', 'Vesta', 'Veta', 'Vi', 'Vicenta', 'Vickey', 'Vicki', 'Vickie', 'Vicky', 'Victoria', 'Victorina', 'Vida', 'Viki', 'Vikki', 'Vilma', 'Vina', 'Vincenza', 'Vinita', 'Vinnie', 'Viola', 'Violet', 'Violeta', 'Violette', 'Virgen', 'Virgie', 'Virgina', 'Virginia', 'Vita', 'Viva', 'Vivan', 'Vivian', 'Viviana', 'Vivien', 'Vivienne', 'Voncile', 'Vonda', 'Vonnie', 'Wai', 'Waltraud', 'Wan', 'Wanda', 'Waneta', 'Wanetta', 'Wanita', 'Wava', 'Wei', 'Wen', 'Wendi', 'Wendie', 'Wendolyn', 'Wendy', 'Wenona', 'Whitley', 'Whitney', 'Wilda', 'Wilhelmina', 'Wilhemina', 'Willa', 'Willena', 'Willene', 'Willetta', 'Willette', 'Willia', 'Williemae', 'Willodean', 'Willow', 'Wilma', 'Windy', 'Winifred', 'Winnie', 'Winnifred', 'Winona', 'Winter', 'Wonda', 'Wynell', 'Wynona', 'Xena', 'Xenia', 'Xiao', 'Xiomara', 'Xochitl', 'Xuan', 'Yadira', 'Yaeko', 'Yael', 'Yahaira', 'Yajaira', 'Yan', 'Yang', 'Yanira', 'Yasmin', 'Yasmine', 'Yasuko', 'Yee', 'Yelena', 'Yen', 'Yer', 'Yesenia', 'Yessenia', 'Yetta', 'Yevette', 'Yi', 'Ying', 'Yoko', 'Yolanda', 'Yolande', 'Yolando', 'Yolonda', 'Yon', 'Yong', 'Yoshie', 'Yoshiko', 'Youlanda', 'Young', 'Yu', 'Yuette', 'Yuk', 'Yuki', 'Yukiko', 'Yuko', 'Yulanda', 'Yun', 'Yung', 'Yuonne', 'Yuri', 'Yuriko', 'Yvette', 'Yvone', 'Yvonne', 'Zada', 'Zaida', 'Zana', 'Zandra', 'Zelda', 'Zella', 'Zelma', 'Zena', 'Zenaida', 'Zenia', 'Zenobia', 'Zetta', 'Zina', 'Zita', 'Zoe', 'Zofia', 'Zoila', 'Zola', 'Zona', 'Zonia', 'Zora', 'Zoraida', 'Zula', 'Zulema', 'Zulma' ); }, 'randomLast' : function() { /* 1000 surnames is enough, right? yeah... better add more. ;p */ return either( 'Abbott', 'Acevedo', 'Acosta', 'Adams', 'Adkins', 'Aguilar', 'Aguirre', 'Alba', 'Alexander', 'Ali', 'Allen', 'Allison', 'Alvarado', 'Alvarez', 'Andersen', 'Anderson', 'Andrade', 'Andrews', 'Anthony', 'Archer', 'Arellano', 'Arias', 'Armstrong', 'Arnold', 'Arroyo', 'Ashley', 'Atkins', 'Atkinson', 'Austin', 'Avery', 'Avila', 'Ayala', 'Ayers', 'Bailey', 'Baird', 'Baker', 'Baldwin', 'Ball', 'Ballard', 'Banks', 'Barajas', 'Barber', 'Barker', 'Barnes', 'Barnett', 'Barr', 'Barrera', 'Barrett', 'Barron', 'Barry', 'Bartlett', 'Barton', 'Bass', 'Bates', 'Bauer', 'Bautista', 'Baxter', 'Bean', 'Beard', 'Beasley', 'Beck', 'Becker', 'Bell', 'Beltran', 'Bender', 'Benitez', 'Benjamin', 'Bennett', 'Benson', 'Bentley', 'Benton', 'Berg', 'Berger', 'Bernard', 'Berry', 'Best', 'Bird', 'Bishop', 'Black', 'Blackburn', 'Blackwell', 'Blair', 'Blake', 'Blanchard', 'Blanchette', 'Blankenship', 'Blevins', 'Bolton', 'Bond', 'Bonilla', 'Booker', 'Boone', 'Booth', 'Bowen', 'Bowers', 'Bowman', 'Boyd', 'Boyer', 'Boyle', 'Bradford', 'Bradley', 'Bradshaw', 'Brady', 'Branch', 'Brandt', 'Braun', 'Bray', 'Brennan', 'Brewer', 'Bridges', 'Briggs', 'Bright', 'Brock', 'Brooks', 'Brown', 'Browning', 'Bruce', 'Bryan', 'Bryant', 'Buchanan', 'Buck', 'Buckley', 'Bullock', 'Burch', 'Burgess', 'Burke', 'Burnett', 'Burns', 'Burton', 'Bush', 'Butler', 'Byrd', 'Cabrera', 'Cain', 'Calderon', 'Caldwell', 'Calhoun', 'Callahan', 'Camacho', 'Cameron', 'Campbell', 'Campos', 'Cannon', 'Cantrell', 'Cantu', 'Cardenas', 'Carey', 'Carlson', 'Carney', 'Carpenter', 'Carr', 'Carrillo', 'Carroll', 'Carson', 'Carter', 'Case', 'Casey', 'Castaneda', 'Castillo', 'Castro', 'Cervantes', 'Chambers', 'Chan', 'Chandler', 'Chaney', 'Chang', 'Chapman', 'Charles', 'Chase', 'Chavez', 'Chen', 'Cherry', 'Choi', 'Christensen', 'Christian', 'Chung', 'Church', 'Cisneros', 'Clark', 'Clarke', 'Clay', 'Clayton', 'Clements', 'Cline', 'Cobb', 'Cochran', 'Coffey', 'Cohen', 'Cole', 'Coleman', 'Collier', 'Collins', 'Colon', 'Combs', 'Compton', 'Conley', 'Conner', 'Conrad', 'Contreras', 'Conway', 'Cook', 'Cooke', 'Cooley', 'Cooper', 'Copeland', 'Cordova', 'Cortez', 'Costa', 'Cowan', 'Cox', 'Craig', 'Crane', 'Crawford', 'Crosby', 'Cross', 'Cruz', 'Cuevas', 'Cummings', 'Cunningham', 'Curry', 'Curtis', 'Cyrus', 'D'Erico', 'DeAngelo', 'DeBoise', 'DeCesare', 'Dalton', 'Daniels', 'Daugherty', 'Davenport', 'David', 'Davidson', 'Davies', 'Davila', 'Davis', 'Dawson', 'Day', 'Dean', 'Decker', 'Delacruz', 'Deleon', 'Delgado', 'Dennis', 'Diaz', 'Dickerson', 'Dickson', 'Dillon', 'Dixon', 'Dodson', 'Dominguez', 'Donaldson', 'Donovan', 'Dorsey', 'Dougherty', 'Douglas', 'Downs', 'Doyle', 'Drake', 'Duarte', 'Dudley', 'Duffy', 'Duke', 'Duncan', 'Dunlap', 'Dunn', 'Duran', 'Durham', 'Dyer', 'Eaton', 'Edwards', 'Electra', 'Elliott', 'Ellis', 'Ellison', 'English', 'Erickson', 'Escobar', 'Esparza', 'Espinoza', 'Estes', 'Estrada', 'Evans', 'Everett', 'Ewing', 'Farley', 'Farmer', 'Farrell', 'Faulkner', 'Ferguson', 'Fernandez', 'Ferrell', 'Fields', 'Figueroa', 'Finley', 'Fischer', 'Fisher', 'Fitzgerald', 'Fitzpatrick', 'Fleming', 'Fletcher', 'Flores', 'Flowers', 'Floyd', 'Flynn', 'Foley', 'Forbes', 'Ford', 'Foster', 'Fowler', 'Fox', 'Francis', 'Franco', 'Frank', 'Franklin', 'Frazier', 'Frederick', 'Freeman', 'French', 'Frey', 'Friedman', 'Fritz', 'Frost', 'Fry', 'Frye', 'Fuentes', 'Fuller', 'Gaines', 'Gallagher', 'Gallegos', 'Galloway', 'Galvan', 'Gamble', 'Garcia', 'Gardner', 'Garner', 'Garrett', 'Garrison', 'Garza', 'Gates', 'Gay', 'Gentry', 'George', 'Gibbs', 'Gibson', 'Gilbert', 'Giles', 'Gill', 'Gillespie', 'Gilmore', 'Glass', 'Glenn', 'Glover', 'Golden', 'Gomez', 'Gonzales', 'Gonzalez', 'Good', 'Goodman', 'Goodwin', 'Gordon', 'Gould', 'Graham', 'Grant', 'Graves', 'Gray', 'Green', 'Greene', 'Greer', 'Gregory', 'Griffin', 'Griffith', 'Grimes', 'Gross', 'Guerra', 'Guerrero', 'Gutierrez', 'Guzman', 'Haas', 'Hahn', 'Hale', 'Haley', 'Hall', 'Hamilton', 'Hammond', 'Hampton', 'Hancock', 'Haney', 'Hanna', 'Hansen', 'Hanson', 'Hardin', 'Harding', 'Hardy', 'Harmon', 'Harper', 'Harrell', 'Harrington', 'Harris', 'Harrison', 'Hart', 'Hartman', 'Harvey', 'Hatfield', 'Hawkins', 'Hayden', 'Hayes', 'Haynes', 'Hays', 'Heath', 'Hebert', 'Henderson', 'Hendricks', 'Hendrix', 'Henry', 'Hensley', 'Henson', 'Herman', 'Hernandez', 'Herrera', 'Herring', 'Hess', 'Hester', 'Hickman', 'Hicks', 'Higgins', 'Hill', 'Hines', 'Hinton', 'Ho', 'Hobbs', 'Hodge', 'Hodges', 'Hoffman', 'Hogan', 'Holden', 'Holder', 'Holland', 'Holloway', 'Holmes', 'Holt', 'Hood', 'Hooper', 'Hoover', 'Hopkins', 'Horn', 'Horne', 'Horton', 'House', 'Houston', 'Howard', 'Howe', 'Howell', 'Huang', 'Hubbard', 'Huber', 'Hudson', 'Huerta', 'Huff', 'Huffman', 'Hughes', 'Hull', 'Humphrey', 'Hunt', 'Hunter', 'Hurley', 'Hurst', 'Hutchinson', 'Huynh', 'Ibarra', 'Ingram', 'Irving', 'Irwin', 'Jackson', 'Jacobs', 'Jacobson', 'James', 'Jarvis', 'Jefferson', 'Jenkins', 'Jennings', 'Jensen', 'Jewel', 'Jewell', 'Jimenez', 'Johns', 'Johnson', 'Johnston', 'Jones', 'Jordan', 'Joseph', 'Joyce', 'Juarez', 'Kaiser', 'Kane', 'Kasey', 'Kaufman', 'Keith', 'Keller', 'Kelley', 'Kelly', 'Kemp', 'Kennedy', 'Kent', 'Kerr', 'Key', 'Khan', 'Kidd', 'Kim', 'King', 'Kirby', 'Kirk', 'Kirkpatrick', 'Klein', 'Kline', 'Knapp', 'Knight', 'Knightly', 'Knox', 'Koch', 'Kramer', 'Krause', 'Krueger', 'Lacey', 'Lam', 'Lamb', 'Lambert', 'Landry', 'Lane', 'Lang', 'Lara', 'Larsen', 'Larson', 'Lawrence', 'Lawson', 'Le', 'Leach', 'LeBlanc', 'Lee', 'Leon', 'Leonard', 'Lester', 'Levine', 'Levy', 'Lewis', 'Li', 'Lin', 'Lincoln', 'Lindsey', 'Little', 'Liu', 'Livingston', 'Lloyd', 'Logan', 'Long', 'Lopez', 'Love', 'Lowe', 'Lowery', 'Lozano', 'Lucas', 'Lucero', 'Luna', 'Lutz', 'Lynch', 'Lynn', 'Lyons', 'Maas', 'MacBride', 'MacCormack', 'MacDermot', 'MacDonald', 'MacGee', 'MacGovern', 'MacGrath', 'MacKay', 'MacKenna', 'MacKeown', 'MacNamara', 'Mace', 'Macias', 'Mack', 'Madden', 'Maddox', 'Maes', 'Mahoney', 'Maldonado', 'Malone', 'Mann', 'Manning', 'Marks', 'Marquez', 'Marsh', 'Marshall', 'Martin', 'Martinez', 'Mason', 'Massey', 'Mata', 'Mathews', 'Mathis', 'Matthews', 'Maxwell', 'May', 'Mayer', 'Maynard', 'Mayo', 'Mays', 'McAllister', 'McArthy', 'McBride', 'McCall', 'McCann', 'McCarthy', 'McCarty', 'McClain', 'McClure', 'McConnell', 'McCormick', 'McCoy', 'McCullough', 'McDaniel', 'McDonald', 'McDowell', 'McFarland', 'McFly', 'McGee', 'McGowan', 'McGrath', 'McGreegor', 'McGuire', 'McHenry', 'McKay', 'McKee', 'McKenzie', 'McKinney', 'McKnight', 'McLaughlin', 'McLean', 'McLeod', 'McLish', 'McMahon', 'McMillan', 'McNally', 'McNeil', 'McPherson', 'McQuaid', 'McQueen', 'McRae', 'Meadows', 'Medina', 'Mejia', 'Melendez', 'Melton', 'Mendez', 'Mendoza', 'Mercado', 'Mercer', 'Merritt', 'Meyer', 'Meyers', 'Meza', 'Michael', 'Middleton', 'Miles', 'Miller', 'Mills', 'Miranda', 'Mitchell', 'Molina', 'Monroe', 'Montes', 'Montgomery', 'Montoya', 'Moody', 'Moon', 'Mooney', 'Moore', 'Mora', 'Morales', 'Moran', 'Moreno', 'Morgan', 'Morris', 'Morrison', 'Morrow', 'Morse', 'Morton', 'Moses', 'Mosley', 'Moss', 'Moyer', 'Mueller', 'Mullen', 'Mullins', 'Munoz', 'Murillo', 'Murphy', 'Murray', 'Myers', 'Nash', 'Navarro', 'Neal', 'Nelson', 'Newman', 'Newton', 'Nguyen', 'Nichols', 'Nicholson', 'Nielsen', 'Nixon', 'Nobel', 'Noble', 'Nolan', 'Norman', 'Norris', 'Norton', 'Novak', 'Nunez', 'O'Brien', 'O'Callaghan', 'O'Connell', 'O'Connor', 'O'Dea', 'O'Dwyer', 'O'Donnell', 'O'Gara', 'O'Grady', 'O'Hagan', 'O'Hara', 'O'Keeffe', 'O'Leary', 'O'Malley', 'O'Meara', 'O'Neal', 'O'Neill', 'O'Reilly', 'O'Rourke', 'O'Shaughnessy', 'O'Shea', 'O'Sullivan', 'O'Toole', 'Ocampo', 'Ochoa', 'Odom', 'Oliver', 'Olsen', 'Olson', 'Orozco', 'Orr', 'Ortega', 'Ortiz', 'Osborn', 'Osborne', 'Owen', 'Owens', 'Pace', 'Pacheco', 'Padilla', 'Page', 'Palmer', 'Park', 'Parker', 'Parks', 'Parrish', 'Parsons', 'Patel', 'Patrick', 'Patterson', 'Patton', 'Paul', 'Payne', 'Pearson', 'Pearce', 'Peay', 'Peck', 'Pena', 'Pennington', 'Perez', 'Perkins', 'Perry', 'Peters', 'Petersen', 'Peterson', 'Petty', 'Pham', 'Phelps', 'Phillips', 'Pierce', 'Pineda', 'Pittman', 'Pitts', 'Pollard', 'Ponce', 'Poole', 'Pope', 'Porter', 'Potter', 'Potts', 'Powell', 'Powers', 'Pratt', 'Preston', 'Price', 'Prince', 'Proctor', 'Pruitt', 'Pugh', 'Quade', 'Quinn', 'Ramirez', 'Ramos', 'Ramsey', 'Randall', 'Randolph', 'Rangel', 'Rasmussen', 'Ray', 'Raymond', 'Reed', 'Reese', 'Reeves', 'Reid', 'Reilly', 'Reyes', 'Reynolds', 'Rhodes', 'Rice', 'Rich', 'Richard', 'Richards', 'Richardson', 'Richmond', 'Riddle', 'Riggs', 'Riley', 'Rios', 'Ritter', 'Rivas', 'Rivera', 'Rivers', 'Roach', 'Robbins', 'Roberson', 'Roberts', 'Robertson', 'Robinson', 'Robles', 'Rocha', 'Rodgers', 'Rodriguez', 'Rogers', 'Rojas', 'Rollins', 'Roman', 'Romero', 'Rosales', 'Rosario', 'Rose', 'Ross', 'Roth', 'Rowe', 'Rowland', 'Roy', 'Rubio', 'Ruiz', 'Rush', 'Russell', 'Russo', 'Ryan', 'Salas', 'Salazar', 'Salinas', 'Sampson', 'Sanchez', 'Sanders', 'Sandoval', 'Sanford', 'Santana', 'Santiago', 'Santos', 'Saunders', 'Savage', 'Sawyer', 'Schaefer', 'Schmidt', 'Schmitt', 'Schneider', 'Schroeder', 'Schultz', 'Schwartz', 'Scott', 'Sellers', 'Serrano', 'Sexton', 'Shaffer', 'Shah', 'Shannon', 'Sharp', 'Shaw', 'Shea', 'Shelton', 'Shepard', 'Shepherd', 'Sheppard', 'Sherman', 'Shields', 'Short', 'Silva', 'Simmons', 'Simon', 'Simpson', 'Sims', 'Singh', 'Singleton', 'Skinner', 'Sloan', 'Small', 'Smith', 'Snow', 'Snyder', 'Solis', 'Solomon', 'Sosa', 'Soto', 'Sparks', 'Spears', 'Spence', 'Spencer', 'St Andrews', 'St Ann', 'St Charles', 'St Clair', 'St Francis', 'St George', 'St James', 'St John', 'St Martin', 'St Michels', 'St Paul', 'St Peters', 'St Thomas', 'St Yves', 'Stafford', 'Stalone', 'Stanley', 'Stanton', 'Stark', 'Steele', 'Stein', 'Stephens', 'Stephenson', 'Stevens', 'Stevenson', 'Stewart', 'Stokes', 'Stone', 'Stout', 'Strickland', 'Strong', 'Stuart', 'Suarez', 'Sullivan', 'Summers', 'Sutton', 'Swanson', 'Sweeney', 'Tanner', 'Tapia', 'Tate', 'Taylor', 'Terrell', 'Terry', 'Thomas', 'Thompson', 'Thornton', 'Todd', 'Torres', 'Townsend', 'Tran', 'Travis', 'Trevino', 'Trujillo', 'Truman', 'Tucker', 'Turner', 'Tyler', 'Uber', 'Uhler', 'Ulibarri', 'Ullmann', 'Underhill', 'Underwood', 'Upton', 'Ute', 'Valdez', 'Valencia', 'Valentine', 'Valenzuela', 'Vance', 'Vang', 'Vargas', 'Vasquez', 'Vaughan', 'Vaughn', 'Vazquez', 'Vega', 'Velasquez', 'Velazquez', 'Velez', 'Villa', 'Villanueva', 'Villarreal', 'Villegas', 'Vincent', 'Wade', 'Wagner', 'Walker', 'Wall', 'Wallace', 'Waller', 'Walls', 'Walsh', 'Walter', 'Walters', 'Walton', 'Wang', 'Ward', 'Ware', 'Warner', 'Warren', 'Washington', 'Waters', 'Watkins', 'Watson', 'Watts', 'Weaver', 'Webb', 'Weber', 'Webster', 'Weeks', 'Weiss', 'Welch', 'Wells', 'Werner', 'West', 'Wheeler', 'Whitaker', 'White', 'Whitehead', 'Whitney', 'Wiggins', 'Wilcox', 'Wiley', 'Wilkerson', 'Wilkins', 'Wilkinson', 'Williams', 'Williamson', 'Willis', 'Wilson', 'Winters', 'Wise', 'Wolf', 'Wolfe', 'Wong', 'Wood', 'Woodard', 'Woods', 'Woodward', 'Wright', 'Wu', 'Wyatt', 'Xi', 'Xiao', 'Xin', 'Xing', 'Xu', 'Xuan', 'Xue', 'Yang', 'Yates', 'Yeoh', 'Yoder', 'York', 'Young', 'Yu', 'Zamora', 'Zavala', 'Zhang', 'Zimmerman', 'Zuniga' ); }, }>>
<div class='combat_window'> <div id='combat_p1'> <<include 'COMBAT P1'>> </div> <div id='combat_log'></div> <div id='combat_act'> <<include 'ACTIONS COMBAT'>> </div> <div id='combat_p2'> <<include 'COMBAT P2'>> </div> </div>
<table class=''> <tr> <td colspan='4'><<print setup.ALIAS.oogleLink(_P1.name, _P1);>></td> </tr> <tr> <td colspan='2'>_P1.age _P1.gender</td> <td>Lv: _P1.level</td><td>Cal: _P1.caliber</td> </tr> <tr> <th colspan='4'><hr/></th> </tr> <tr> <td>Height:</td><td>_P1.ht</td> <td>Weight:</td><td>_P1.wt</td> </tr> <tr> <td>Tone %:</td><td>_P1.tone</td> <td>Fat %:</td><td>_P1.fat</td> </tr> <tr> <td>Bicep:</td><td>_P1.bicep</td> <td>Quads:</td><td>_P1.quads</td> </tr> <tr> <td>Figure:</td> <td colspan='3'>_P1.figure</td> </tr> <tr> <th colspan='4'><hr/></th> </tr> <tr> <th>STR:</th><th>_P1.str</th> <th>END:</th><th>_P1.end</th> </tr> <tr> <th>SPD:</th><th>_P1.spd</th> <th>PHY:</th><th>_P1.phy</th> </tr> <tr> <th>WSD:</th><th>_P1.wsd</th> <th>INS:</th><th>_P1.ins</th> </tr> <tr> <th colspan='4'><hr/></th> </tr> </table> <div class='resources'> <<print setup.ALIAS.getResource('light', _P1) >> <<print setup.ALIAS.getResource('dark', _P1) >> <<print setup.ALIAS.getResource('qi', _P1) >> <p class='normal'></p> <<if settings.lod_energyMatrix>> <div class='energy-matrix half-glass'> <<print setup.ALIAS.getResource('vigor', _P1) >> <<print setup.ALIAS.getResource('train', _P1) >> <<print setup.ALIAS.getResource('tough', _P1) >> <<print setup.ALIAS.getResource('power', _P1) >> <<print setup.ALIAS.getResource('skill', _P1) >> <<print setup.ALIAS.getResource('aware', _P1) >> <<print setup.ALIAS.getResource('vital', _P1) >> <<print setup.ALIAS.getResource('metab', _P1) >> <<print setup.ALIAS.getResource('focus', _P1) >> <<print setup.ALIAS.getResource('guard', _P1) >> <<print setup.ALIAS.getResource('react', _P1) >> <<print setup.ALIAS.getResource('psych', _P1) >> <<print setup.ALIAS.getResource('regen', _P1) >> <<print setup.ALIAS.getResource('force', _P1) >> <<print setup.ALIAS.getResource('fight', _P1) >> </div> <</if>> </div> <div> <h4>CONDITION:</h4> <<print setup.ALIAS.listConditions(_P1); >> </div>
<table class=''> <tr> <td colspan='4'><<print setup.ALIAS.oogleLink(_P2.name, _P2);>></td> </tr> <tr> <td colspan='2'>_P2.age _P2.gender</td> <td>Lv: _P2.level</td><td>Cal: _P2.caliber</td> </tr> <tr> <th colspan='4'><hr/></th> </tr> <tr> <td>Height:</td><td>_P2.ht</td> <td>Weight:</td><td>_P2.wt</td> </tr> <tr> <td>Tone %:</td><td>_P2.tone</td> <td>Fat %:</td><td>_P2.fat</td> </tr> <tr> <td>Bicep:</td><td>_P2.bicep</td> <td>Quads:</td><td>_P2.quads</td> </tr> <tr> <td>Figure:</td> <td colspan='3'>_P2.figure</td> </tr> <tr> <th colspan='4'><hr/></th> </tr> <tr> <th>STR:</th><th>_P2.str</th> <th>END:</th><th>_P2.end</th> </tr> <tr> <th>SPD:</th><th>_P2.spd</th> <th>PHY:</th><th>_P2.phy</th> </tr> <tr> <th>WSD:</th><th>_P2.wsd</th> <th>INS:</th><th>_P2.ins</th> </tr> <tr> <th colspan='4'><hr/></th> </tr> </table> <div class='resources'> <<print setup.ALIAS.getResource('light', _P2) >> <<print setup.ALIAS.getResource('dark', _P2) >> <<print setup.ALIAS.getResource('qi', _P2) >> <p class='normal'></p> <<if settings.lod_energyMatrix>> <div class='energy-matrix half-glass'> <<print setup.ALIAS.getResource('vigor', _P2) >> <<print setup.ALIAS.getResource('train', _P2) >> <<print setup.ALIAS.getResource('tough', _P2) >> <<print setup.ALIAS.getResource('power', _P2) >> <<print setup.ALIAS.getResource('skill', _P2) >> <<print setup.ALIAS.getResource('aware', _P2) >> <<print setup.ALIAS.getResource('vital', _P2) >> <<print setup.ALIAS.getResource('metab', _P2) >> <<print setup.ALIAS.getResource('focus', _P2) >> <<print setup.ALIAS.getResource('guard', _P2) >> <<print setup.ALIAS.getResource('react', _P2) >> <<print setup.ALIAS.getResource('psych', _P2) >> <<print setup.ALIAS.getResource('regen', _P2) >> <<print setup.ALIAS.getResource('force', _P2) >> <<print setup.ALIAS.getResource('fight', _P2) >> </div> <</if>> </div> <div> <h4>CONDITION:</h4> <<print setup.ALIAS.listConditions(_P2); >> </div>
<<set /* setup.ALIAS.statGet(stat, secAlias, CHAR); */ _S1 = setup.ALIAS.statGet('all', 'current', _P1); _S2 = setup.ALIAS.statGet('all', 'current', _P2); >> <<if !((_P1.ko && !(_P2.ko||_P2.stun||_P2.dead))||(_P1.ko>=2)||_P1.dead) &&(_P1.stun || ( _P1.LIMBS.ARMS.pct<=0 && _P1.LIMBS.LEGS.pct<=0 && _P1.LIMBS.CORE.pct<=0 ))>> <div class='action keypress' key='[SPACE]' title='this isn't good...'> <<link 'WAIT...'>> <<set _round++; >> <<prepend '#combat_log'>> <div class='btl_evt'> <div class='btl_msg'><span class='cnd_msg'>You are too injured to fight back or run...</span></div> <div class='btl_msg'><<set _ACT2=setup.ALIAS.combatAction(_P2, _P1, 'auto'); >><span class='cnt_msg'>_ACT2['cnt_msg']</span> <span class='hit_msg'>_ACT2['hit_msg']</span> <span class='cnd_msg'>_ACT2['cnd_msg']</span></div> </div> <</prepend>> <<run if(!_hasKilled && _P2.dead) { _hasKilled=true; setup.ALIAS.darkAdd(setup.ALIAS.logX(10, 10000, '-'), _P1); } >> <<print setup.ALIAS.combat_refreshAll();>> <</link>> </div> <</if>> <<if !(_P1.stun||_P1.ko||_P1.dead) && !_P2.gone && !_P1.escaped && !_P2.escaped>> <div class='action keypress' key='1' title='don't hold back...'> <<if _P1.LIMBS.ARMS.pct>0>> <<link 'PUNCH'>> <<set _round++; >> <<prepend '#combat_log'>> <div class='btl_evt'> <div class='btl_msg'><<set _ACT1=setup.ALIAS.combatAction(_P1, _P2, 'punch'); >><span class='cnt_msg'>_ACT1['cnt_msg']</span> <span class='hit_msg'>_ACT1['hit_msg']</span> <span class='cnd_msg'>_ACT1['cnd_msg']</span></div> <div class='btl_msg'><<set _ACT2=setup.ALIAS.combatAction(_P2, _P1, 'auto'); >><span class='cnt_msg'>_ACT2['cnt_msg']</span> <span class='hit_msg'>_ACT2['hit_msg']</span> <span class='cnd_msg'>_ACT2['cnd_msg']</span></div> </div> <</prepend>> <<run if(!_hasKilled && _P2.dead) { _hasKilled=true; setup.ALIAS.darkAdd(setup.ALIAS.logX(10, 10000, '-'), _P1); } >> <<print setup.ALIAS.combat_refreshAll();>> <</link>> <<else>> <a title='you're arms are too badly damaged to punch...' class='disabled'>PUNCH</a> <</if>> </div> <</if>> <<if !(_P1.stun||_P1.ko||_P1.dead) && !_P2.gone && !_P1.escaped && !_P2.escaped>> <div class='action keypress' key='2' title='full fury...'> <<if _P1.LIMBS.LEGS.pct>0>> <<link 'KICK'>> <<set _round++; >> <<prepend '#combat_log'>> <div class='btl_evt'> <div class='btl_msg'><<set _ACT1=setup.ALIAS.combatAction(_P1, _P2, 'kick'); >><span class='cnt_msg'>_ACT1['cnt_msg']</span> <span class='hit_msg'>_ACT1['hit_msg']</span> <span class='cnd_msg'>_ACT1['cnd_msg']</span></div> <div class='btl_msg'><<set _ACT2=setup.ALIAS.combatAction(_P2, _P1, 'auto'); >><span class='cnt_msg'>_ACT2['cnt_msg']</span> <span class='hit_msg'>_ACT2['hit_msg']</span> <span class='cnd_msg'>_ACT2['cnd_msg']</span></div> </div> <</prepend>> <<run if(!_hasKilled && _P2.dead) { _hasKilled=true; setup.ALIAS.darkAdd(setup.ALIAS.logX(10, 10000, '-'), _P1); } >> <<print setup.ALIAS.combat_refreshAll();>> <</link>> <<else>> <a title='you're legs are too badly damaged to kick...' class='disabled'>KICK</a> <</if>> </div> <</if>> <<if !(_P1.stun||_P1.ko||_P1.dead) && !_P2.gone && !_P1.escaped && !_P2.escaped>> <div class='action keypress' key='3' title='try not to kill them...'> <<if _P1.LIMBS.ARMS.pct>0>> <<link 'SLAP'>> <<set _round++; >> <<prepend '#combat_log'>> <div class='btl_evt'> <div class='btl_msg'><<set _ACT1=setup.ALIAS.combatAction(_P1, _P2, 'slap'); >><span class='cnt_msg'>_ACT1['cnt_msg']</span> <span class='hit_msg'>_ACT1['hit_msg']</span> <span class='cnd_msg'>_ACT1['cnd_msg']</span></div> <div class='btl_msg'><<set _ACT2=setup.ALIAS.combatAction(_P2, _P1, 'auto'); >><span class='cnt_msg'>_ACT2['cnt_msg']</span> <span class='hit_msg'>_ACT2['hit_msg']</span> <span class='cnd_msg'>_ACT2['cnd_msg']</span></div> </div> <</prepend>> <<run if(!_hasKilled && _P2.dead) { _hasKilled=true; setup.ALIAS.darkAdd(setup.ALIAS.logX(10, 10000, '-'), _P1); } >> <<print setup.ALIAS.combat_refreshAll();>> <</link>> <<else>> <a title='you're arms are too badly damaged to slap...' class='disabled'>SLAP</a> <</if>> </div> <</if>> <<if !(_P1.stun||_P1.ko||_P1.dead) && !_P2.gone && !_P1.escaped && !_P2.escaped>> <div class='action keypress' key='4' title='daze them...'> <<if _P1.LIMBS.CORE.pct>0>> <<link 'HEADBUTT'>> <<set _round++; >> <<prepend '#combat_log'>> <div class='btl_evt'> <div class='btl_msg'><<set _ACT1=setup.ALIAS.combatAction(_P1, _P2, 'headbutt'); >><span class='cnt_msg'>_ACT1['cnt_msg']</span> <span class='hit_msg'>_ACT1['hit_msg']</span> <span class='cnd_msg'>_ACT1['cnd_msg']</span></div> <div class='btl_msg'><<set _ACT2=setup.ALIAS.combatAction(_P2, _P1, 'auto'); >><span class='cnt_msg'>_ACT2['cnt_msg']</span> <span class='hit_msg'>_ACT2['hit_msg']</span> <span class='cnd_msg'>_ACT2['cnd_msg']</span></div> </div> <</prepend>> <<run if(!_hasKilled && _P2.dead) { _hasKilled=true; setup.ALIAS.darkAdd(setup.ALIAS.logX(10, 10000, '-'), _P1); } >> <<print setup.ALIAS.combat_refreshAll();>> <</link>> <<else>> <a title='you're core is too badly damaged to headbutt...' class='disabled'>[TEST: HEADBUTT]</a> <</if>> </div> <</if>> <<if !(_P1.stun||_P1.ko||_P1.dead) && !_P2.gone && !_P1.escaped && !_P2.escaped>> <<if ( _P2.stun || _P2.dead || _P1.LIMBS.ARMS.pct<=0 )>> <div class='action keypress' key='5' title='take a moment... (rest and recover stamina)'> <<link 'REST'>> <<set _round++; >> <<prepend '#combat_log'>> <div class='btl_evt'> <div class='btl_msg'><<set _ACT1=setup.ALIAS.combatAction(_P1, _P2, 'rest'); >><span class='cnt_msg'>_ACT1['cnt_msg']</span> <span class='hit_msg'>_ACT1['hit_msg']</span> <span class='cnd_msg'>_ACT1['cnd_msg']</span></div> <div class='btl_msg'><<set _ACT2=setup.ALIAS.combatAction(_P2, _P1, 'auto'); >><span class='cnt_msg'>_ACT2['cnt_msg']</span> <span class='hit_msg'>_ACT2['hit_msg']</span> <span class='cnd_msg'>_ACT2['cnd_msg']</span></div> </div> <</prepend>> <<run if(!_hasKilled && _P2.dead) { _hasKilled=true; setup.ALIAS.darkAdd(setup.ALIAS.logX(10, 10000, '-'), _P1); } >> <<print setup.ALIAS.combat_refreshAll();>> <</link>> </div> <<else>> <div class='action keypress' key='5' title='take a defensive posture... (half-rest + enables counter attacks)'> <<link 'GUARD'>> <<set _round++; >> <<prepend '#combat_log'>> <div class='btl_evt'> <div class='btl_msg'><<set _ACT1=setup.ALIAS.combatAction(_P1, _P2, 'guard'); >><span class='cnt_msg'>_ACT1['cnt_msg']</span> <span class='hit_msg'>_ACT1['hit_msg']</span> <span class='cnd_msg'>_ACT1['cnd_msg']</span></div> <div class='btl_msg'><<set _ACT2=setup.ALIAS.combatAction(_P2, _P1, 'auto'); >><span class='cnt_msg'>_ACT2['cnt_msg']</span> <span class='hit_msg'>_ACT2['hit_msg']</span> <span class='cnd_msg'>_ACT2['cnd_msg']</span></div> </div> <</prepend>> <<run if(!_hasKilled && _P2.dead) { _hasKilled=true; setup.ALIAS.darkAdd(setup.ALIAS.logX(10, 10000, '-'), _P1); } >> <<print setup.ALIAS.combat_refreshAll();>> <</link>> </div> <</if>> <</if>> <<if !(_P1.stun||_P1.ko||_P1.dead) && !_P2.gone && !_P1.escaped && !_P2.escaped>> <div class='action keypress' key='6' title='give them a free shot... (disables counter attacks)'> <<link 'TAUNT'>> <<set _round++; >> <<prepend '#combat_log'>> <div class='btl_evt'> <div class='btl_msg'><<set _ACT1=setup.ALIAS.combatAction(_P1, _P2, 'taunt'); >><span class='cnt_msg'>_ACT1['cnt_msg']</span> <span class='hit_msg'>_ACT1['hit_msg']</span> <span class='cnd_msg'>_ACT1['cnd_msg']</span></div> <div class='btl_msg'><<set _ACT2=setup.ALIAS.combatAction(_P2, _P1, either('punch', 'punch', 'punch', 'kick', 'auto')); >><span class='cnt_msg'>_ACT2['cnt_msg']</span> <span class='hit_msg'>_ACT2['hit_msg']</span> <span class='cnd_msg'>_ACT2['cnd_msg']</span></div> </div> <</prepend>> <<print setup.ALIAS.combat_refreshAll();>> <</link>> </div> <</if>> <<if !(_P1.stun||_P1.ko||_P1.dead) && !_P2.gone && !_P1.escaped && !_P2.escaped>> <div class='action' title='must escape...'> <<if _P1.LIMBS.LEGS.pct>0 && _P1.LIMBS.CORE.pct>0 && !_P2.ko>> <<link 'FLEE'>> <<set _round++; >> <<prepend '#combat_log'>> <div class='btl_evt'> <div class='btl_msg'><<set _ACT1=setup.ALIAS.combatWithdraw(_P1, _P2, 'flee'); >><span class='cnt_msg'>_ACT1['cnt_msg']</span> <span class='hit_msg'>_ACT1['hit_msg']</span> <span class='cnd_msg'>_ACT1['cnd_msg']</span></div> <<if !_P1.escaped>> <div class='btl_msg'><<set _ACT2=setup.ALIAS.combatAction(_P2, _P1, 'auto'); >><span class='cnt_msg'>_ACT2['cnt_msg']</span> <span class='hit_msg'>_ACT2['hit_msg']</span> <span class='cnd_msg'>_ACT2['cnd_msg']</span></div> <</if>> </div> <</prepend>> <<run if(!_hasKilled && _P2.dead) { _hasKilled=true; setup.ALIAS.darkAdd(setup.ALIAS.logX(10, 10000, '-'), _P1); } >> <<print setup.ALIAS.combat_refreshAll();>> <</link>> <<elseif _P2.ko>> <a title='there is no reason to run now...' class='disabled'>[TEST: FLEE]</a> <<elseif _P1.LIMBS.LEGS.pct>0>> <a title='you're legs are too badly damaged to run...' class='disabled'>[TEST: FLEE]</a> <<elseif _P1.LIMBS.CORE.pct>0>> <a title='you're core is too badly damaged to run...' class='disabled'>[TEST: FLEE]</a> <<else>> <a title='you're legs and core are too badly damaged to run...' class='disabled'>[TEST: FLEE]</a> <</if>> </div> <</if>> <<if !(_P1.stun||_P1.ko||_P1.dead) && (_P2.stun || _P2.dead) && !_P2.gone && !_P1.escaped && !_P2.escaped>> <div class='action'> <<if !_P2.dead && ( _S2.max_qi>30 || ( _P2.METRICS.ht>1 && settings.mac_heightGain ) ) && (_P1.MATRIX.dark>=_S2.level) >> <<link '[TEST: DRAIN]'>> <<set _ACT1 = setup.ALIAS.combatDrain(_P1, _P2, 'beta'); >> <<prepend '#combat_log'>><div class='btl_evt'> <div class='btl_msg'><span class='hit_msg'>You drained _P2.name, taking <<print (_ACT1.pct*100).toFixed(0);>>% of <<print setup.ALIAS.his_her(_P2.gender);>> power as your own.<<print (_ACT1.shards>0 ? '.. and creating '+_ACT1.shards+' blood-shards.' : '');>></span></div> <div class='btl_msg'><span class='cnd_msg'> <<if _P2.dead>> The drain was more than <<print setup.ALIAS.his_her(_P2.gender);>> weakened body could handle, there's simply nothing left to take. <<run if(!_hasKilled && _P2.dead) { _hasKilled=true; setup.ALIAS.darkAdd(setup.ALIAS.logX(10, 10000, '-'), _P1); } >> <<else>> Well, <<print setup.ALIAS.he_she(_P2.gender);>>'s a bit smaller than before, but it looks like <<print setup.ALIAS.he_she(_P2.gender);>>'ll probably survive... <</if>> </span></div> </div><</prepend>> <<print setup.ALIAS.combat_refreshAll();>> <</link>> <<elseif (_P1.MATRIX.dark<(_S2.caliber*_S2.level))>> <a title='not enough dark energy to feed...' class='disabled'>[TEST: FEED]</a> <<else>> <a title='nothing left to take...' class='disabled'>[TEST: FEED]</a> <</if>> </div> <</if>> <<if !(_P1.stun||_P1.ko||_P1.dead) && (_P2.stun || _P2.dead) && !_P2.gone && !_P1.escaped && !_P2.escaped>> <div class='action'> <<if _P1.MATRIX.focus>1 && (_P1.MATRIX.qi/_S1.max_qi>0.10)>> <<link '[TEST: HEAL]'>> <<run setup.ALIAS.combatHeal(_P1, _P2, 'beta'); >> <<prepend '#combat_log'>><div class='btl_evt'> <div class='btl_msg'><span class='hit_msg'>Tapping into the Primal Flow, you channel your focus to heal _P2.name_first, and watch as <<print setup.ALIAS.his_her(_P2.gender);>> wounds begin to close...</span></div> <div class='btl_msg'><span class='cnd_msg'> <<if Math.random()<(setup.ALIAS.sqrt(_S1.caliber, '+')*setup.ALIAS.rand(0.16,16.0)/1000)>> <<print either( 'A fluctuation in the field triggers', 'A momentary distraction results in', 'A ripple sends back', 'An eddy in the current generates', 'Losing yourself in ecstacy of the raw Primal Force, you call forth' ); >> a Wild Surge, as <<print setup.ALIAS.wildSurge(_P1, _P2); >> <<run setup.ALIAS.do_status_update(_P2); setup.ALIAS.combat_refreshFighterInfo(_P2); setup.ALIAS.do_status_update(_P1); setup.ALIAS.combat_refreshFighterInfo(_P1); >> <<else>> <<if (_P2.dead && (setup.ALIAS.charTempVar(_P2, 'newQi')>(_S2.max_qi/3)))>> Unbelievably, you manage to stabley channel enough raw primal essence to completely restore _P2.name_first back to life. <<run setup.ALIAS.combatRevive(_P1, _P2, 'beta'); setup.ALIAS.combat_refreshFighterInfo(_P2); setup.ALIAS.combat_refreshFighterInfo(_P1); if(!_hasRaised) { _hasRaised=true; setup.ALIAS.lightAdd(setup.ALIAS.logX(10, 10000, '-'), _P1); } >> <<elseif (_P2.dead)>> <<set _P2.MATRIX.qi=Math.min(0, _P2.MATRIX.qi)>> Despite your efforts, _P2.name_first is still dead. <<elseif _P2.MATRIX.qi>0>> The energies coursing through <<print setup.ALIAS.his_her(_P2.gender);>> body were strong enough to get <<print setup.ALIAS.him_her(_P2.gender);>> back on <<print setup.ALIAS.his_her(_P2.gender);>> feet... <<set _P2.stun = false;>> <<else>> Though in better condition than before, _P2.name_first is still out. <</if>> <</if>> </span></div> </div><</prepend>> <<print setup.ALIAS.combat_refreshAll();>> <</link>> <<else>> <a title='you're too weak right now, perhaps if you rested a bit first...' class='disabled'>[TEST: HEAL]</a> <</if>> </div> <</if>> <<if _P2.actor==='cpu-npc' && !(_P1.stun||_P1.ko||_P1.dead) && (_P2.stun || _P2.dead) && !_P1.escaped && !_P2.gone && !_P2.escaped>> <div class='action' title='not yet implemented...'> <<if true >> <<link 'DEMAND APOLOGY'>> <<prepend '#combat_log'>><div class='btl_evt'><div class='btl_msg'>You demand an apology, unfortunately _P2.name is in no condition to talk...</div></div><</prepend>> <<run setup.ALIAS.darkAdd(setup.ALIAS.logX(10, 1, '-'), _P1); >> <</link>> <<else>> <a title='...' class='disabled'>DEMAND APOLOGY</a> <</if>> </div> <</if>> <<if _P2.actor==='cpu-npc' && !(_P1.stun||_P1.ko||_P1.dead) && (_P2.stun || _P2.dead) && !_P1.escaped && !_P2.gone && !_P2.escaped>> <div class='action' title='not yet implemented...'> <<if true >> <<link 'DEMAND TRIBUTE'>> <<prepend '#combat_log'>><div class='btl_evt'><div class='btl_msg'>You demand tribute, but _P2.name is still <<print (_P2.STATUS.qi=='killed' ? 'dead' : _P2.STATUS.qi);>>.</div></div><</prepend>> <<run setup.ALIAS.darkAdd(setup.ALIAS.logX(10, 10, '-'), _P1); >> <</link>> <<else>> <a title='...' class='disabled'>DEMAND TRIBUTE</a> <</if>> </div> <</if>> <<if _P2.actor==='cpu-npc' && !(_P1.stun||_P1.ko||_P1.dead) && (_P2.ko || _P2.dead) && !_P1.escaped && !_P2.gone && !_P2.escaped>> <div class='action'> <<if _LICENSE && !_took_wallet >> <<link 'TAKE WALLET'>> <<prepend '#combat_log'>><div class='btl_evt'><div class='btl_msg'>You took _P2.name's wallet, there was <<print "$"+ _cash.toFixed(2) +"";>> inside.</div></div><</prepend>> <<run setup.ALIAS.lightAdd(-setup.ALIAS.logX(10, (100+(_cash*3)), '-'), $G.PC); $G.PC.MATRIX.money += _cash; $G.PC.JUNK['wallet-'+Date.now()] = _wallet; $G.PC.JUNK[_LICENSE.cardtype+'-'+Date.now()] = _LICENSE.name + ''s ' + _LICENSE.cardtype + ' (' + _LICENSE.gender + ' age ' + _LICENSE.age + ", "+setup.ALIAS.formatHeight(_LICENSE.ht)+ ", "+setup.ALIAS.formatWeight(_LICENSE.wt)+ ')'; _took_wallet = true; _took_cash = true; _took_id = true; >> <<replace '#combat_act'>><<include 'ACTIONS COMBAT'>><</replace>> <</link>> <<else>> <a title='the wallet's gone...' class='disabled'>TAKE WALLET</a> <</if>> </div> <</if>> <<if _P2.actor==='cpu-npc' && !(_P1.stun||_P1.ko||_P1.dead) && (_P2.ko || _P2.dead) && !_P2.gone && !_P1.escaped && !_P2.escaped>> <div class='action'> <<if _LICENSE && !_took_cash >> <<link 'TAKE MONEY'>> <<prepend '#combat_log'>><div class='btl_evt'><div class='btl_msg'>You took <<print "$"+ _cash.toFixed(2) +" cash";>>.</div></div><</prepend>> <<run setup.ALIAS.lightAdd(-setup.ALIAS.logX(10, (100+(_cash*3)), '-'), $G.PC); $G.PC.MATRIX.money += _cash; _took_cash = true; _cash=0; >> <<replace '#combat_act'>><<include 'ACTIONS COMBAT'>><</replace>> <</link>> <<else>> <a title='they have no money...' class='disabled'>TAKE MONEY</a> <</if>> </div> <</if>> <<if _P2.actor==='cpu-npc' && !(_P1.stun||_P1.ko||_P1.dead) && (_P2.ko || _P2.dead) && !_P2.gone && !_P1.escaped && !_P2.escaped>> <div class='action' title='you could always use another slave...'> <<if !_P2.kidnapped>> <<link 'TAKE HOME'>> <<prepend '#combat_log'>><div class='btl_evt'><div class='btl_msg'>You claim _P2.name as your beta, taking <<print (_P2.gender=='male' ? 'him' : 'her');>> home with you.</div></div><</prepend>> <<run setup.ALIAS.lightAdd(-setup.ALIAS.logX(10, 3000, '-'), _P1); setup.ALIAS.takeHome(_P2, _P1); _P2.kidnapped=true; >> <<replace '#combat_act'>><<include 'ACTIONS COMBAT'>><</replace>> <</link>> <<else>> <a title='you've already claimed them...' class='disabled'>TAKE HOME</a> <</if>> </div> <</if>> <<if !(_P1.stun||_P1.ko||_P1.dead) && (_P2.stun || _P2.dead) && !_P1.escaped && !_P2.escaped>><div class='action'><<link 'LEAVE'>><<run if(_P2.dead || _P2.kidnapped) { setup.ALIAS.enemyForget(_P2, _P1); } setup.ALIAS.showSideBar(); setup.ALIAS.giveFeedback('An exhilarating fight! You did well.'); setup.ALIAS.powerTransfer(_P2, _P1, 0.034); $G.WORLD.girlPower+=0.01; >><<print setup.ALIAS.reloadPassage();>><</link>></div><</if>> <<if ((_P1.ko && !(_P2.ko||_P2.stun||_P2.dead))||(_P1.ko>=2)||_P1.dead) && !_P1.escaped && !_P2.escaped>><div class='action' title='not good...'><<link 'CONTINUE'>><<run if(_P2.actor==='cpu-npc') { setup.ALIAS.enemyRemember(_P2, _P1); setup.ALIAS.slaveFree(_P2.uid||_P2.name, _P1); _P2.kidnapped=false; setup.ALIAS.levelAdd(Math.min(_S1.caliber*3, _S1.level*0.03), _P2); setup.ALIAS.levelAdd(-Math.min(_S1.caliber*3, _S1.level*0.03), _P1); (_P1.MATRIX.money) && (_P1.MATRIX.money*=0.9); } setup.ALIAS.combat_refreshFighterInfo(_P1); setup.ALIAS.combat_refreshFighterInfo(_P2); setup.ALIAS.showSideBar(); setup.ALIAS.giveFeedback('you were defeated' + (_P1.dead ? '... and killed.' : ', somehow you made it back home...')); $G.WORLD.girlPower+=(_P2.gender=='male' ? -0.01 : 0.01); _P1.stun=false; >><<goto 'GO HOME'>><</link>></div><</if>> <<run setup.ALIAS.trim_combatLog();>> <<if _P1.escaped || _P2.escaped>><div class='action' title='escaped...'><<link 'CONTINUE'>><<run if(_P2.actor==='cpu-npc') { setup.ALIAS.enemyRemember(_P2, _P1); if(_P2.uid) { setup.ALIAS.slaveFree(_P2.uid||_P2.name, _P1); } _P2.kidnapped=false; } setup.ALIAS.showSideBar(); if(_P1.escaped) { setup.ALIAS.giveFeedback('you ran away...' +(_P1.MATRIX.vigor<1 ? ' you still feel your lungs burning- perhaps you should rest a bit.' : '')); $G.WORLD.girlPower+=(_P2.gender=='male' ? -0.01 : 0.01); } else { setup.ALIAS.giveFeedback(_P2.name_first +' ran away... wonder what scared '+ setup.ALIAS.him_her(_P2.gender) +' so?'); $G.WORLD.girlPower+=0.01; } _P1.escaped=false; _P2.escaped=false; >><<goto 'GO HOME'>><</link>></div><</if>> <<run setup.ALIAS.trim_combatLog();>>
<<set setup.ACTIONS.COMBAT = { 'punch': {'hours': 0.0001, 'MATRIX':{'tough': -0.10, 'power': -5.00, 'vigor': -2.00, 'skill': -1.00, 'train': -1.00, 'regen': -0.10, 'vital': -0.10, 'force': -1.00, 'guard': -1.00, 'metab': -0.10, 'fight': -3.00, 'react': -0.50, 'focus': -0.30, 'aware': -0.10, 'psych': -0.10, 'qi': 15.00, 'karma': 0.00, 'dark': 1.00, 'kcal': -1.00, 'protein': -0.10, 'sugar': -0.20} }, /* END setup.ACTIONS.COMBAT */ }>>
<<set setup.ACTIONS.EXPLORE = { 'drive': {'hours': 0.25, 'MATRIX':{'tough': -0.20, 'power': -0.20, 'vigor': -5.00, 'skill': -3.00, 'train': -3.00, 'regen': -0.10, 'vital': -0.40, 'force': -5.00, 'guard': -10.00, 'metab': -0.20, 'fight': -4.00, 'react': -5.00, 'focus': -6.00, 'aware': -5.00, 'psych': -7.00, 'qi': -1.00, 'karma': -1.00, 'petro': -2.00, 'kcal': -2.00, 'protein': -0.20, 'sugar': -0.60} }, 'search': {'hours': 0.25, 'MATRIX':{'tough': -0.20, 'power': -0.40, 'vigor': -4.00, 'skill': -1.00, 'train': -1.00, 'regen': -0.10, 'vital': -0.20, 'force': -2.00, 'guard': -2.00, 'metab': -0.10, 'fight': -1.00, 'react': -1.00, 'focus': -3.00, 'aware': -5.00, 'psych': -7.00, 'qi': -1.00, 'karma': -1.00, 'kcal': -2.00, 'protein': -0.01, 'sugar': -0.10} }, 'shop': {'hours': 0.25, 'MATRIX':{'tough': -0.20, 'power': -0.40, 'vigor': -2.00, 'skill': -1.00, 'train': -1.00, 'regen': -0.10, 'vital': -0.20, 'force': -3.00, 'guard': -3.00, 'metab': -0.10, 'fight': -1.00, 'react': -1.00, 'focus': -1.00, 'aware': -1.00, 'psych': -4.00, 'qi': -1.00, 'karma': -0.10, 'kcal': -1.50, 'protein': -0.01, 'sugar': -0.10} }, /* END setup.ACTIONS.EXPLORE */ }>>
<<set setup.ACTIONS.TRAIN = { 'walk': {'hours': 1.50, 'MATRIX':{'tough': -5.00, 'power': -4.00, 'vigor': -8.00, 'skill': -2.00, 'train': -3.00, 'regen': -3.00, 'vital': -5.00, 'force': -3.00, 'guard': -3.00, 'metab': -4.00, 'fight': -2.00, 'react': -4.00, 'focus': -2.00, 'aware': -4.00, 'psych': -10.00, 'qi': -1.00, 'karma': 5.00, 'light': 1.00, 'dark': 1.00, 'kcal': -1.50, 'protein': -0.02, 'sugar': -0.28} }, 'jog': {'hours': 1.00, 'MATRIX':{'tough': -30.00, 'power': -16.00, 'vigor': -40.00, 'skill': -6.00, 'train': -9.00, 'regen': -24.00, 'vital': -30.00, 'force': -30.00, 'guard': -10.00, 'metab': -30.00, 'fight': -10.00, 'react': -15.00, 'focus': -10.00, 'aware': -10.00, 'psych': -7.00, 'qi': -1.00, 'karma': 35.00, 'light': 3.00, 'dark': 3.00, 'kcal': -3.00, 'protein': -0.04, 'sugar': -0.55} }, 'run': {'hours': 0.50, 'MATRIX':{'tough': -45.00, 'power': -34.00, 'vigor': -120.00, 'skill': -12.00, 'train': -15.00, 'regen': -38.00, 'vital': -60.00, 'force': -80.00, 'guard': -35.00, 'metab': -60.00, 'fight': -20.00, 'react': -24.00, 'focus': -15.00, 'aware': -12.00, 'psych': -5.00, 'qi': -1.00, 'karma': 75.00, 'light': 5.00, 'dark': 5.00, 'kcal': -6.00, 'protein': -0.10, 'sugar': -1.60} }, 'sprint': {'hours': 0.25, 'MATRIX':{'tough': -60.00, 'power': -60.00, 'vigor': -180.00, 'skill': -18.00, 'train': -18.00, 'regen': -52.00, 'vital': -90.00, 'force': -90.00, 'guard': -60.00, 'metab': -90.00, 'fight': -25.00, 'react': -30.00, 'focus': -18.00, 'aware': -15.00, 'psych': -3.00, 'qi': -1.00, 'karma': 120.00, 'light': 7.00, 'dark': 7.00, 'kcal': -12.00, 'protein': -0.20, 'sugar': -3.80} }, 'calisthenics': {'hours': 0.50, 'MATRIX':{'tough': -50.00, 'power': -90.00, 'vigor': -120.00, 'skill': -12.00, 'train': -9.00, 'regen': -30.00, 'vital': -40.00, 'force': -30.00, 'guard': -5.00, 'metab': -30.00, 'fight': -25.00, 'react': -15.00, 'focus': -30.00, 'aware': -5.00, 'psych': -10.00, 'qi': -1.00, 'karma': 75.00, 'light': 5.00, 'dark': 5.00, 'kcal': -4.00, 'protein': -0.12, 'sugar': -0.90} }, 'aerobics': {'hours': 0.50, 'MATRIX':{'tough': -30.00, 'power': -21.00, 'vigor': -90.00, 'skill': -12.00, 'train': -12.00, 'regen': -50.00, 'vital': -90.00, 'force': -45.00, 'guard': -15.00, 'metab': -50.00, 'fight': -35.00, 'react': -35.00, 'focus': -25.00, 'aware': -2.00, 'psych': -4.00, 'qi': -1.00, 'karma': 65.00, 'light': 3.00, 'dark': 3.00, 'kcal': -3.00, 'protein': -0.06, 'sugar': -0.85} }, 'yoga': {'hours': 0.50, 'MATRIX':{'tough': -40.00, 'power': -38.00, 'vigor': -60.00, 'skill': -18.00, 'train': -21.00, 'regen': -60.00, 'vital': -80.00, 'force': -60.00, 'guard': -15.00, 'metab': -45.00, 'fight': -15.00, 'react': -45.00, 'focus': -60.00, 'aware': -75.00, 'psych': -40.00, 'qi': -1.00, 'karma': 90.00, 'light': 1.00, 'dark': 1.00, 'kcal': -2.00, 'protein': -0.05, 'sugar': -0.40} }, 'weightlifting': {'hours': 0.25, 'MATRIX':{'tough': -80.00, 'power': -120.00, 'vigor': -70.00, 'skill': -36.00, 'train': -42.00, 'regen': -18.00, 'vital': -24.00, 'force': -15.00, 'guard': -20.00, 'metab': -45.00, 'fight': -35.00, 'react': -28.00, 'focus': -27.00, 'aware': -14.00, 'psych': -7.00, 'qi': -1.00, 'karma': 170.00, 'light': 10.00, 'dark': 10.00, 'kcal': -5.40, 'protein': -0.34, 'sugar': -1.00} }, 'crossfit': {'hours': 0.50, 'MATRIX':{'tough': -120.00, 'power': -90.00, 'vigor': -240.00, 'skill': -18.00, 'train': -15.00, 'regen': -75.00, 'vital': -90.00, 'force': -75.00, 'guard': -55.00, 'metab': -90.00, 'fight': -45.00, 'react': -45.00, 'focus': -30.00, 'aware': -10.00, 'psych': -15.00, 'qi': -1.00, 'karma': 295.00, 'light': 10.00, 'dark': 10.00, 'kcal': -7.80, 'protein': -0.42, 'sugar': -3.50} }, 'powerlifting': {'hours': 0.25, 'MATRIX':{'tough': -160.00, 'power': -210.00, 'vigor': -180.00, 'skill': -30.00, 'train': -27.00, 'regen': -40.00, 'vital': -60.00, 'force': -70.00, 'guard': -40.00, 'metab': -60.00, 'fight': -40.00, 'react': -35.00, 'focus': -28.00, 'aware': -4.00, 'psych': -12.00, 'qi': -1.00, 'karma': 245.00, 'light': 10.00, 'dark': 10.00, 'kcal': -9.40, 'protein': -0.69, 'sugar': -2.10} }, /* END setup.ACTIONS.TRAIN */ }>>
<<set setup.ACTIONS.REST = { 'sleep': {'hours': 7.00, 'MATRIX':{'tough': 0.10, 'power': 0.10, 'vigor': 0.10, 'skill': 0.10, 'train': 0.10, 'regen': 0.10, 'vital': 0.10, 'force': 0.10, 'guard': 0.10, 'metab': 0.10, 'fight': 0.10, 'react': 0.10, 'focus': 0.10, 'aware': 0.10, 'psych': -30.00, 'qi': 300.00, 'karma': 0.10, 'kcal': -0.30, 'protein': -0.03, 'sugar': -0.10}, 'canDo': function(CHAR) { CHAR=CHAR||$G.PC; return true; } }, 'rest': {'hours': 0.25, 'MATRIX':{'tough': 0.10, 'power': 0.10, 'vigor': 0.20, 'skill': 0.10, 'train': 0.10, 'regen': 0.10, 'vital': 0.10, 'force': 0.10, 'guard': 0.10, 'metab': 0.10, 'fight': 0.10, 'react': 0.10, 'focus': 0.10, 'aware': 0.10, 'psych': -5.00, 'qi': 90.00, 'karma': 0.10, 'kcal': -0.50, 'protein': -0.02, 'sugar': -0.10}, 'canDo': function(CHAR) { CHAR=CHAR||$G.PC; return true; } }, 'stretch': {'hours': 0.05, 'MATRIX':{'tough': -0.10, 'power': -0.10, 'vigor': -0.40, 'skill': -0.10, 'train': -0.10, 'regen': -0.10, 'vital': -0.10, 'force': -0.10, 'guard': -0.10, 'metab': -0.10, 'fight': -0.10, 'react': -0.10, 'focus': -0.10, 'aware': -0.10, 'psych': -5.00, 'qi': 45.00, 'karma': 0.10, 'kcal': -2.00, 'protein': -0.10, 'sugar': -0.20}, 'canDo': function(CHAR) { CHAR=CHAR||$G.PC; return true; } }, /* END setup.ACTIONS.REST */ }>>
<div class='fill'> <div> <h1>GAME OVER</h1> <p id='CoD'><<print $G.PC.NAMES.first +' '+ setup.ALIAS.causeOfDeath($G.PC) +"<br/> on "+ setup.ALIAS.getLongDate() + "<br/> at "+setup.ALIAS.getTime('12');>></p> <p id='Epitaph'><<print setup.ALIAS.write_epitaph($G.PC);>></p> <<run setup.ALIAS.showSideBar();>> </div> </div>
<<if !_slave>> <br/><br/><br/><br/><br/> <div class='slaves'><<print setup.ALIAS.slavesList($G.PC);>></div> <p></p> <p></p> <p class='keypress' key='[ESC]'><<link 'RETURN'>> <<run if('GO HOME'==State.passage) { Engine.play(State.passage, true); } setup.ALIAS.menuHide(); >> <</link>></p> <<else>> <div class='slaves'><<print setup.ALIAS.slaveInteractions(_slave, $G.PC);>></div> <p></p> <p></p> <p class='keypress' key='[ESC]'><<link 'RETURN'>> <<unset _slave>> <<run setup.ALIAS.menuShow('slaves');>> <</link>></p> <</if>>
<<set _time=setup.ALIAS.getTime('24'); >> <<replace '#datetime'>><<include 'DATETIME'>><</replace>> <<if (_time>'04:59')&&(_time<'21:00') >> <<if !_section>> <<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<set $G.WORLD.girlPower += 0.034;>> <<set setup.ALIAS.worldVarSet('rate.encounters.gym', 1.0);>> <h2>WELCOME TO THE GYM</h2> <p><<linkreplace 'DESK'>> As you approach, you are greeted by a <<print setup.ALIAS.abFlicker('cute', ' cat '); >> girl with a warm smile. According to the nameplate, she's Katie, the desk <<print setup.ALIAS.abFlicker('clerk. ', 'cleric.'); >> She sets down the box of <<print setup.ALIAS.abFlicker('necco', ' neko '); >> wafers and says, <span class='npc_reaction female'>"We're having a special right now, first month's free! Oh, but some areas are still closed for- um... repairs. The Lift Stations and PT areas have all been fixed though"</span>, she smiles and winks at you. <<print setup.ALIAS.run_abFlicker();>> <<print setup.ENCOUNTERS.KATIE.CHOICES.haveShards();>> <</linkreplace>></p> <p><<link 'WORKOUT'>><<set _section='workout'>><<print setup.ALIAS.reloadPassage();>><</link>></p> <p><<link 'JUICE BAR'>><<set _section='juicebar'>><<print setup.ALIAS.reloadPassage();>><</link>></p> <p><<linkreplace '!LOOK AROUND'>>Looks like a gym...<</linkreplace>></p> <p><<linkreplace '!TAKE THE TOUR'>>Well, this is it...<</linkreplace>></p> <p><<linkreplace '!LOCKERS'>>sorry, only paid members can go to the locker room or use the showers...<</linkreplace>></p> <p><<linkreplace '!RESTROOM'>>out of order<</linkreplace>></p> <p><<linkappend 'CHECK MUSCLETONE'>><<print setup.ALIAS.listMuscleStatus($G.PC);>><</linkappend>></p> <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>> <<else>> <<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<switch _section>> <<case 'workout'>> <<set setup.ALIAS.worldVarSet('rate.encounters.gym', 0.034);>> <<if !_area>> <p class='narrow'>note: training is achieved by damaging target area, recovery requires resting...</p> <p class='narrow'><small>(also note some of the gym workouts are incomplete, time-based exercises will still report as reps completed with weight, and the gym-equipment has no upper-limit on load levels at present, nor does it use discrete plate units.)</small></p> <p class='keypress' key='1'><<link 'BALANCED ROUTINES' >><<set _area='routines' >><<print setup.ALIAS.reloadPassage(); >><</link>></p> <p class='keypress' key='2'><<link 'CLASSES' >><<set _area='class' >><<print setup.ALIAS.reloadPassage(); >><</link>></p> <p class='keypress' key='3'><<link 'CARDIO MACHINES' >><<set _area='cardio' >><<print setup.ALIAS.reloadPassage(); >><</link>></p> <p class='keypress' key='4'><<link 'PT AREA' >><<set _area='pt bars' >><<print setup.ALIAS.reloadPassage(); >><</link>></p> <p class='keypress' key='5'><<link 'CROSSFIT' >><<set _area='crossfit' >><<print setup.ALIAS.reloadPassage(); >><</link>></p> <p class='keypress' key='6'><<link 'LIFT STATIONS' >><<set _area='lifts' >><<print setup.ALIAS.reloadPassage(); >><</link>></p> <p class='keypress' key='[ESC]'><<link 'RETURN'>><<unset _section>><<print setup.ALIAS.reloadPassage();>><</link>></p> <<else>> <<if !_workout>> <<print setup.ALIAS.gym_listWorkoutsForArea(_area, $G.PC); >> <p class='keypress' key='[ESC]'><<link 'RETURN'>><<unset _area>><<print setup.ALIAS.reloadPassage();>><</link>></p> <<else>> _workout <<if !_load>> <<print setup.ALIAS.gym_listLoadsForWorkout(_workout, $G.PC);>> <p class='keypress' key='[ESC]'><<link 'RETURN'>><<unset _workout>><<print setup.ALIAS.reloadPassage();>><</link>></p> <<else>> <<print setup.ALIAS.doLift($G.PC, {'workout':_workout, 'weight':_weight, 'bonus':_bonus, 'reps':'*', });>> <<print setup.ALIAS.gym_listLoadsForWorkout(_workout, $G.PC);>> <p class='keypress' key='[SPACE]'><<link 'CONTINUE'>><<unset _load>><<print setup.ALIAS.reloadPassage();>><</link>></p> <</if>> <</if>> <</if>> <<case 'juicebar'>> <h3>JUICE BAR</h3> <p>(closed for renovations...)</p> <p class='keypress' key='[ESC]'><<link 'RETURN'>><<unset _section>><<print setup.ALIAS.reloadPassage();>><</link>></p> <</switch>> <</if>> <<print setup.ALIAS.afterPassage();>> <p></p> <</if>> <<else>> <<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<set setup.ALIAS.worldVarSet('rate.encounters.gym', 1.0);>> <p>You see a sign that reads, "SORRY, WE'RE CLOSED RIGHT NOW. PLEASE COME BACK AFTER 05:00 AM".</p> <p>What do you do?</p> <div><<print setup.ALIAS.exitPassage();>></div> <</if>> <</if>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>>
<<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<replace '#datetime'>><<include 'DATETIME'>><</replace>> <h2>Sammy's North-69 Diner</h2> <p>(coming soon)</p> <!-- <p>WAIT TO BE SEATED</p> <p>RESTROOM</p> --> <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>>
<<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<replace '#datetime'>><<include 'DATETIME'>><</replace>> <h2>Rudy's 24-hr Non-Stop Gas!</h2> <p>(coming soon)</p> <!-- <p>buy gas</p> <p>get snacks</p> --> <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>>
<<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<replace '#datetime'>><<include 'DATETIME'>><</replace>> <h2>the North-<b>69</b> Motel</h2> <p>(coming soon)</p> <!-- <p>check in/out</p> <p>go to room</p> --> <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>>
<<include 'NAVIGATION'>>
<<set setup.WORKOUTS={ 'Circuit (Balanced)': {'area': 'routines', 'action': 'weightlifting', 'units': 'workouts', 'pbw': 0.50, 'pls': 1.00, 'total': 22.00, 'MATRIX':{'Calves': 1.00, 'Quads': 1.00, 'Hams': 1.00, 'Glutes': 1.00, 'Hips': 1.00, 'LoBack': 1.00, 'Lats': 1.00, 'Traps': 1.00, 'Abs': 1.00, 'Pecs': 1.00, 'Delts': 1.00, 'LeftTri': 1.00, 'RightTri': 1.00, 'LeftBi': 1.00, 'RightBi': 1.00, 'LeftFore': 1.00, 'RightFore': 1.00, 'LeftGrip': 1.00, 'RightGrip': 1.00, 'Cardio': 1.00, 'Kegel': 1.00, 'Brain': 1.00} }, 'Circuit (Core)': {'area': 'routines', 'action': 'weightlifting', 'units': 'workouts', 'pbw': 0.50, 'pls': 1.00, 'total': 25.00, 'MATRIX':{'Glutes': 2.00, 'Hips': 2.00, 'LoBack': 4.00, 'Lats': 1.00, 'Traps': 2.00, 'Abs': 5.00, 'Pecs': 2.00, 'Delts': 2.00, 'Cardio': 2.00, 'Kegel': 2.00, 'Brain': 1.00} }, 'Circuit (Lower)': {'area': 'routines', 'action': 'weightlifting', 'units': 'workouts', 'pbw': 0.50, 'pls': 1.20, 'total': 10.00, 'MATRIX':{'Calves': 1.00, 'Quads': 2.00, 'Hams': 1.00, 'Glutes': 2.00, 'Hips': 1.00, 'LoBack': 1.00, 'Cardio': 1.00, 'Kegel': 1.00} }, 'Circuit (Upper)': {'area': 'routines', 'action': 'weightlifting', 'units': 'workouts', 'pbw': 0.50, 'pls': 0.80, 'total': 50.00, 'MATRIX':{'LoBack': 1.00, 'Lats': 4.00, 'Traps': 4.00, 'Abs': 3.00, 'Pecs': 5.00, 'Delts': 5.00, 'LeftTri': 3.00, 'RightTri': 3.00, 'LeftBi': 4.00, 'RightBi': 4.00, 'LeftFore': 2.00, 'RightFore': 2.00, 'LeftGrip': 4.00, 'RightGrip': 4.00, 'Cardio': 1.00, 'Kegel': 1.00} }, 'Aerobics': {'area': 'class', 'action': 'aerobics', 'units': 'workouts', 'pbw': 0.50, 'pls': 0.50, 'total': 27.00, 'MATRIX':{'Calves': 3.00, 'Quads': 1.00, 'Hams': 1.00, 'Glutes': 3.00, 'Hips': 3.00, 'LoBack': 3.00, 'Abs': 3.00, 'Delts': 3.00, 'Cardio': 5.00, 'Kegel': 2.00} }, 'Crossfit': {'area': 'class', 'action': 'crossfit', 'units': 'challenges', 'pbw': 1.00, 'pls': 1.00, 'total': '*', 'MATRIX':{'Calves': '*', 'Quads': '*', 'Hams': '*', 'Glutes': '*', 'Hips': '*', 'LoBack': '*', 'Lats': '*', 'Traps': '*', 'Abs': '*', 'Pecs': '*', 'Delts': '*', 'LeftTri': '*', 'RightTri': '*', 'LeftBi': '*', 'RightBi': '*', 'LeftFore': '*', 'RightFore': '*', 'LeftGrip': '*', 'RightGrip': '*', 'Cardio': '*', 'Kegel': 2.00, 'Brain': 1.00} }, 'Yoga': {'area': 'class', 'action': 'yoga', 'units': 'positions', 'pbw': 0.50, 'pls': 0.50, 'total': 26.00, 'MATRIX':{'Calves': 1.00, 'Quads': 1.00, 'Hams': 1.00, 'Glutes': 1.00, 'Hips': 1.00, 'LoBack': 1.00, 'Lats': 1.00, 'Traps': 1.00, 'Abs': 1.00, 'Pecs': 1.00, 'Delts': 1.00, 'LeftTri': 1.00, 'RightTri': 1.00, 'LeftBi': 1.00, 'RightBi': 1.00, 'LeftFore': 1.00, 'RightFore': 1.00, 'LeftGrip': 1.00, 'RightGrip': 1.00, 'Cardio': 1.00, 'Kegel': 3.00, 'Brain': 3.00} }, 'Bike': {'area': 'cardio', 'action': 'aerobics', 'units': 'min', 'pbw': 0.00, 'pls': 2.00, 'total': 15.00, 'MATRIX':{'Calves': 1.00, 'Quads': 3.00, 'Hams': 3.00, 'Glutes': 3.00, 'Hips': 1.00, 'LoBack': 1.00, 'Cardio': 1.00, 'Kegel': 2.00} }, 'Elliptical': {'area': 'cardio', 'action': 'aerobics', 'units': 'min', 'pbw': 0.50, 'pls': 1.00, 'total': 23.00, 'MATRIX':{'Calves': 1.00, 'Quads': 3.00, 'Hams': 3.00, 'Glutes': 3.00, 'Hips': 3.00, 'LoBack': 1.00, 'Abs': 1.00, 'Pecs': 1.00, 'Delts': 1.00, 'LeftFore': 1.00, 'RightFore': 1.00, 'Cardio': 1.00, 'Kegel': 3.00} }, 'Treadmill': {'area': 'cardio', 'action': 'jog', 'units': 'min', 'pbw': 0.25, 'pls': 1.50, 'total': 18.00, 'MATRIX':{'Calves': 3.00, 'Quads': 3.00, 'Hams': 3.00, 'Glutes': 3.00, 'Hips': 3.00, 'LoBack': 1.00, 'Abs': 1.00, 'Cardio': 1.00} }, 'Back Extension': {'area': 'pt bars', 'action': 'calisthenics', 'units': 'reps', 'pbw': 0.50, 'pls': 0.50, 'total': 24.00, 'MATRIX':{'Calves': 1.00, 'Hams': 2.00, 'Glutes': 5.00, 'LoBack': 13.00, 'Traps': 1.00, 'Cardio': 2.00} }, 'Crunch': {'area': 'pt bars', 'action': 'calisthenics', 'units': 'reps', 'pbw': 0.50, 'pls': 1.60, 'total': 15.00, 'MATRIX':{'Hips': 1.00, 'LoBack': 1.00, 'Abs': 9.00, 'Cardio': 1.00, 'Kegel': 3.00} }, 'Dips': {'area': 'pt bars', 'action': 'calisthenics', 'units': 'reps', 'pbw': 1.00, 'pls': 0.55, 'total': 26.00, 'MATRIX':{'Lats': 3.00, 'Traps': 1.00, 'Abs': 1.00, 'Pecs': 1.00, 'Delts': 3.00, 'LeftTri': 5.00, 'RightTri': 5.00, 'LeftFore': 2.00, 'RightFore': 2.00, 'LeftGrip': 1.00, 'RightGrip': 1.00, 'Cardio': 1.00} }, 'Leg Raise': {'area': 'pt bars', 'action': 'calisthenics', 'units': 'reps', 'pbw': 0.50, 'pls': 0.50, 'total': 11.00, 'MATRIX':{'Hips': 7.00, 'Abs': 1.00, 'Cardio': 1.00, 'Kegel': 2.00} }, 'Lunge': {'area': 'pt bars', 'action': 'calisthenics', 'units': 'reps', 'pbw': 1.00, 'pls': 1.00, 'total': 32.00, 'MATRIX':{'Quads': 11.00, 'Hams': 5.00, 'Glutes': 7.00, 'Hips': 5.00, 'LoBack': 1.00, 'Abs': 1.00, 'Cardio': 1.00, 'Kegel': 1.00} }, 'Pull-up': {'area': 'pt bars', 'action': 'calisthenics', 'units': 'reps', 'pbw': 1.00, 'pls': 0.50, 'total': 56.00, 'MATRIX':{'Lats': 11.00, 'Traps': 4.00, 'Pecs': 7.00, 'Delts': 7.00, 'LeftBi': 3.00, 'RightBi': 3.00, 'LeftFore': 2.00, 'RightFore': 2.00, 'LeftGrip': 7.00, 'RightGrip': 7.00, 'Cardio': 3.00} }, 'Push-up': {'area': 'pt bars', 'action': 'calisthenics', 'units': 'reps', 'pbw': 0.75, 'pls': 1.10, 'total': 33.00, 'MATRIX':{'LoBack': 1.00, 'Traps': 1.00, 'Abs': 2.00, 'Pecs': 11.00, 'Delts': 3.00, 'LeftTri': 5.00, 'RightTri': 5.00, 'LeftFore': 1.00, 'RightFore': 1.00, 'Cardio': 3.00} }, 'Battle Ropes': {'area': 'crossfit', 'action': 'crossfit', 'units': 'min', 'pbw': 0.00, 'pls': 0.70, 'total': 36.00, 'MATRIX':{'Quads': 1.00, 'Glutes': 1.00, 'Hips': 1.00, 'LoBack': 1.00, 'Lats': 3.00, 'Traps': 3.00, 'Abs': 1.00, 'Pecs': 1.00, 'Delts': 3.00, 'LeftTri': 3.00, 'RightTri': 3.00, 'LeftBi': 3.00, 'RightBi': 3.00, 'LeftFore': 1.00, 'RightFore': 1.00, 'LeftGrip': 3.00, 'RightGrip': 3.00, 'Cardio': 1.00} }, 'Farmers Walk': {'area': 'crossfit', 'action': 'crossfit', 'units': 'min', 'pbw': 0.00, 'pls': 1.00, 'total': 20.00, 'MATRIX':{'Quads': 1.00, 'Glutes': 1.00, 'LoBack': 1.00, 'Abs': 1.00, 'Delts': 1.00, 'LeftBi': 1.00, 'RightBi': 1.00, 'LeftFore': 1.00, 'RightFore': 1.00, 'LeftGrip': 5.00, 'RightGrip': 5.00, 'Cardio': 1.00} }, 'Peg Board': {'area': 'crossfit', 'action': 'crossfit', 'units': 'min', 'pbw': 2.00, 'pls': 0.50, 'total': 48.00, 'MATRIX':{'LoBack': 1.00, 'Lats': 5.00, 'Traps': 1.00, 'Abs': 1.00, 'Pecs': 1.00, 'Delts': 1.00, 'LeftBi': 3.00, 'RightBi': 3.00, 'LeftFore': 3.00, 'RightFore': 3.00, 'LeftGrip': 9.00, 'RightGrip': 9.00, 'Cardio': 3.00, 'Kegel': 3.00, 'Brain': 2.00} }, 'Plyometrics': {'area': 'crossfit', 'action': 'crossfit', 'units': 'min', 'pbw': 1.00, 'pls': 1.00, 'total': 27.00, 'MATRIX':{'Calves': 5.00, 'Quads': 5.00, 'Hams': 3.00, 'Glutes': 5.00, 'Hips': 3.00, 'LoBack': 1.00, 'Abs': 1.00, 'Cardio': 1.00, 'Kegel': 3.00} }, 'Bench Press': {'area': 'lifts', 'action': 'weightlifting', 'units': 'reps', 'pbw': 0.00, 'pls': 1.10, 'total': 51.00, 'MATRIX':{'Hips': 1.00, 'LoBack': 1.00, 'Traps': 1.00, 'Abs': 2.00, 'Pecs': 19.00, 'Delts': 4.00, 'LeftTri': 5.00, 'RightTri': 5.00, 'LeftFore': 2.00, 'RightFore': 2.00, 'LeftGrip': 2.00, 'RightGrip': 2.00, 'Cardio': 2.00, 'Kegel': 3.00} }, 'Bent-over Row': {'area': 'lifts', 'action': 'weightlifting', 'units': 'reps', 'pbw': 0.00, 'pls': 0.70, 'total': 19.00, 'MATRIX':{'LoBack': 1.00, 'Lats': 5.00, 'Traps': 2.00, 'Abs': 1.00, 'LeftBi': 2.00, 'RightBi': 2.00, 'LeftFore': 1.00, 'RightFore': 1.00, 'LeftGrip': 1.00, 'RightGrip': 1.00, 'Cardio': 2.00} }, 'Biceps Curl': {'area': 'lifts', 'action': 'weightlifting', 'units': 'reps', 'pbw': 0.00, 'pls': 0.50, 'total': 60.00, 'MATRIX':{'Traps': 1.00, 'Abs': 1.00, 'Pecs': 1.00, 'Delts': 2.00, 'LeftBi': 17.00, 'RightBi': 17.00, 'LeftFore': 6.00, 'RightFore': 6.00, 'LeftGrip': 3.00, 'RightGrip': 3.00, 'Cardio': 2.00, 'Kegel': 1.00} }, 'Calf Raise': {'area': 'lifts', 'action': 'weightlifting', 'units': 'reps', 'pbw': 1.00, 'pls': 1.40, 'total': 25.00, 'MATRIX':{'Calves': 17.00, 'Quads': 3.00, 'Glutes': 1.00, 'Traps': 1.00, 'Abs': 2.00, 'Cardio': 1.00} }, 'Chest Fly': {'area': 'lifts', 'action': 'weightlifting', 'units': 'reps', 'pbw': 0.00, 'pls': 1.10, 'total': 42.00, 'MATRIX':{'Abs': 1.00, 'Pecs': 16.00, 'Delts': 4.00, 'LeftBi': 5.00, 'RightBi': 5.00, 'LeftFore': 2.00, 'RightFore': 2.00, 'LeftGrip': 2.00, 'RightGrip': 2.00, 'Cardio': 2.00, 'Kegel': 1.00} }, 'Deadlift': {'area': 'lifts', 'action': 'weightlifting', 'units': 'reps', 'pbw': 0.00, 'pls': 1.00, 'total': 37.00, 'MATRIX':{'Calves': 1.00, 'Quads': 3.00, 'Hams': 3.00, 'Glutes': 5.00, 'Hips': 2.00, 'LoBack': 9.00, 'Traps': 2.00, 'Abs': 1.00, 'LeftFore': 1.00, 'RightFore': 1.00, 'LeftGrip': 3.00, 'RightGrip': 3.00, 'Cardio': 2.00, 'Kegel': 1.00} }, 'Lateral Raise': {'area': 'lifts', 'action': 'weightlifting', 'units': 'reps', 'pbw': 0.25, 'pls': 0.40, 'total': 28.00, 'MATRIX':{'Traps': 5.00, 'Abs': 1.00, 'Pecs': 1.00, 'Delts': 13.00, 'LeftFore': 1.00, 'RightFore': 1.00, 'LeftGrip': 2.00, 'RightGrip': 2.00, 'Cardio': 2.00} }, 'Leg Curl': {'area': 'lifts', 'action': 'weightlifting', 'units': 'reps', 'pbw': 0.00, 'pls': 0.70, 'total': 36.00, 'MATRIX':{'Calves': 1.00, 'Hams': 19.00, 'Glutes': 9.00, 'Cardio': 2.00, 'Kegel': 5.00} }, 'Leg Extension': {'area': 'lifts', 'action': 'weightlifting', 'units': 'reps', 'pbw': 0.00, 'pls': 1.00, 'total': 21.00, 'MATRIX':{'Quads': 13.00, 'Glutes': 1.00, 'Hips': 4.00, 'Cardio': 2.00, 'Kegel': 1.00} }, 'Leg Press': {'area': 'lifts', 'action': 'weightlifting', 'units': 'reps', 'pbw': 0.25, 'pls': 2.00, 'total': 26.00, 'MATRIX':{'Calves': 1.00, 'Quads': 9.00, 'Hams': 1.00, 'Glutes': 11.00, 'LoBack': 1.00, 'Traps': 1.00, 'Cardio': 1.00, 'Kegel': 1.00} }, 'Military Press': {'area': 'lifts', 'action': 'weightlifting', 'units': 'reps', 'pbw': 0.00, 'pls': 0.60, 'total': 48.00, 'MATRIX':{'Quads': 2.00, 'Glutes': 1.00, 'LoBack': 1.00, 'Traps': 5.00, 'Abs': 2.00, 'Pecs': 4.00, 'Delts': 13.00, 'LeftTri': 5.00, 'RightTri': 5.00, 'LeftBi': 1.00, 'RightBi': 1.00, 'LeftFore': 2.00, 'RightFore': 2.00, 'Cardio': 3.00, 'Kegel': 1.00} }, 'Pull-down': {'area': 'lifts', 'action': 'weightlifting', 'units': 'reps', 'pbw': 0.00, 'pls': 0.80, 'total': 31.00, 'MATRIX':{'LoBack': 1.00, 'Lats': 9.00, 'Traps': 1.00, 'Abs': 1.00, 'Pecs': 2.00, 'Delts': 2.00, 'LeftTri': 1.00, 'RightTri': 1.00, 'LeftBi': 2.00, 'RightBi': 2.00, 'LeftFore': 1.00, 'RightFore': 1.00, 'LeftGrip': 2.00, 'RightGrip': 2.00, 'Cardio': 3.00} }, 'Shoulder Shrug': {'area': 'lifts', 'action': 'weightlifting', 'units': 'reps', 'pbw': 0.00, 'pls': 1.00, 'total': 34.00, 'MATRIX':{'Traps': 15.00, 'Pecs': 2.00, 'Delts': 7.00, 'LeftBi': 1.00, 'RightBi': 1.00, 'LeftFore': 1.00, 'RightFore': 1.00, 'LeftGrip': 2.00, 'RightGrip': 2.00, 'Cardio': 2.00} }, 'Squat': {'area': 'lifts', 'action': 'weightlifting', 'units': 'reps', 'pbw': 1.00, 'pls': 1.50, 'total': 70.00, 'MATRIX':{'Calves': 3.00, 'Quads': 13.00, 'Hams': 2.00, 'Glutes': 17.00, 'Hips': 5.00, 'LoBack': 3.00, 'Lats': 1.00, 'Traps': 1.00, 'Abs': 5.00, 'Pecs': 1.00, 'Delts': 1.00, 'LeftTri': 1.00, 'RightTri': 1.00, 'LeftBi': 1.00, 'RightBi': 1.00, 'LeftFore': 2.00, 'RightFore': 2.00, 'LeftGrip': 2.00, 'RightGrip': 2.00, 'Cardio': 3.00, 'Kegel': 3.00} }, 'Triceps Extension': {'area': 'lifts', 'action': 'weightlifting', 'units': 'reps', 'pbw': 0.00, 'pls': 0.55, 'total': 50.00, 'MATRIX':{'LoBack': 1.00, 'Lats': 1.00, 'Traps': 1.00, 'Abs': 1.00, 'Pecs': 1.00, 'Delts': 1.00, 'LeftTri': 17.00, 'RightTri': 17.00, 'LeftFore': 2.00, 'RightFore': 2.00, 'LeftGrip': 2.00, 'RightGrip': 2.00, 'Cardio': 2.00} }, 'Upright Row': {'area': 'lifts', 'action': 'weightlifting', 'units': 'reps', 'pbw': 0.00, 'pls': 0.70, 'total': 44.00, 'MATRIX':{'Glutes': 1.00, 'Traps': 17.00, 'Abs': 1.00, 'Pecs': 1.00, 'Delts': 11.00, 'LeftBi': 1.00, 'RightBi': 1.00, 'LeftFore': 2.00, 'RightFore': 2.00, 'LeftGrip': 2.00, 'RightGrip': 2.00, 'Cardio': 3.00} }, 'Wrist Curl': {'area': 'lifts', 'action': 'weightlifting', 'units': 'reps', 'pbw': 0.00, 'pls': 0.30, 'total': 33.00, 'MATRIX':{'LeftBi': 2.00, 'RightBi': 2.00, 'LeftFore': 9.00, 'RightFore': 9.00, 'LeftGrip': 4.00, 'RightGrip': 4.00, 'Cardio': 2.00, 'Kegel': 1.00} }, /* END setup.WORKOUTS */}>>
<<set setup.MENU={ 'guide' :{ 'passage':'GUIDE' , 'short':null , 'long':null , 'key':null , 'icon':null , 'show':function() { return true; }, }, 'food' :{ 'passage':'FOOD' , 'short':'Food' , 'long':'EAT SOMETHING' , 'key':'F' , 'icon':'' , 'show':function() { return true && setup.ALIAS.canDo('EXPLORE', 'search', 1/60, 1.0, $G.PC); }, }, 'equip' :{ 'passage':'EQUIP' , 'short':'Clothing' , 'long':'CHANGE CLOTHES' , 'key':'C' , 'icon':'' , 'show':function() { return true && setup.ALIAS.canDo('EXPLORE', 'search', 1/60, 1.0, $G.PC); }, }, 'stuff' :{ 'passage':'STUFF' , 'short':'Stuff' , 'long':'USE SOMETHING' , 'key':'G' , 'icon':'' , 'show':function() { return true && setup.ALIAS.canDo('EXPLORE', 'search', 1/60, 1.0, $G.PC); }, }, 'self' :{ 'passage':'SELF' , 'short':'Self' , 'long':'EXAMINE SELF' , 'key':'V' , 'icon':'' , 'show':function() { return true && setup.ALIAS.canDo('EXPLORE', 'search', 1/60, 1.0, $G.PC); }, }, 'slaves' :{ 'passage':'SLAVES' , 'short':'Slaves' , 'long':'CHECK SLAVES' , 'key':'B' , 'icon':'' , 'show':function() { return (Object.keys($G.PC.SLAVES).length>0) && setup.ALIAS.canDo('EXPLORE', 'search', 1/60, 1.0, $G.PC); }, }, 'powers' :{ 'passage':'POWERS' , 'short':'Powers' , 'long':'DEVELOP POWERS' , 'key':'X' , 'icon':'' , 'show':function() { return true && setup.ALIAS.canDo('EXPLORE', 'search', 1/60, 1.0, $G.PC); }, }, /* END setup.MENU */ }>>
<<set setup.BODY={ 'Calves' :{ 'type':'muscle', 'name':'Calves', }, 'Quads' :{ 'type':'muscle', 'name':'Quadriceps', }, 'Hams' :{ 'type':'muscle', 'name':'Hamstrings', }, 'Glutes' :{ 'type':'muscle', 'name':'Gluteus', }, 'Hips' :{ 'type':'muscle', 'name':'Hipflexors', }, 'LoBack' :{ 'type':'muscle', 'name':'Lower Back', }, 'Lats' :{ 'type':'muscle', 'name':'Latissimus', }, 'Traps' :{ 'type':'muscle', 'name':'Trapezius', }, 'Abs' :{ 'type':'muscle', 'name':'Abdominals', }, 'Pecs' :{ 'type':'muscle', 'name':'Pectorals', }, 'Delts' :{ 'type':'muscle', 'name':'Deltoids', }, 'LeftTri' :{ 'type':'muscle', 'name':'Tricep (L)', }, 'RightTri' :{ 'type':'muscle', 'name':'Tricep (R)', }, 'LeftBi' :{ 'type':'muscle', 'name':'Bicep (L)', }, 'RightBi' :{ 'type':'muscle', 'name':'Bicep (R)', }, 'LeftFore' :{ 'type':'muscle', 'name':'Forearm (L)', }, 'RightFore' :{ 'type':'muscle', 'name':'Forearm (R)', }, 'LeftGrip' :{ 'type':'muscle', 'name':'Grip (L)', }, 'RightGrip' :{ 'type':'muscle', 'name':'Grip (R)', }, 'Cardio' :{ 'type':'muscle', 'name':'Cardio', }, 'Kegel' :{ 'type':'muscle', 'name':'Kegel', }, 'Brain' :{ 'type':'organ' , 'name':'Brain', }, /* END setup.BODY */ }>>
<p>You come to in a small crater... looks like a meteor impact, but the bruises say it was you. How the hell did you wind up here...</p> <p>Last thing you remember is trying to dock your damaged fighter when the carrier exploded. You don't remember any systems nearby, so there's no telling how you got here- whatever world <i>this</i> is.</p> <<run setup.ALIAS.setTime(4,23)>> <p>You're completely naked, not surprising after that blast, but it means you don't have your gear- which makes this a lot harder...</p> <p>~Tech looks pretty backwater- contacting the fleet is out of the question; won't be easy finding a way off this rock... sun will be up soon, <span class='keypress' key='[SPACE]'>[[better have look around->GO HOME]]</span>.</p>
<p class='narrow'><<if setup.ALIAS.canDo('REST', 'sleep', 1, 1.0, $G.PC) >>[[TAKE A 2 HOUR NAP->TAKE A NAP]]<</if>></p> <p class='narrow'><<if setup.ALIAS.canDo('REST', 'rest', 15/60, 1.0, $G.PC) >>[[REST FOR 20 MIN->REST A BIT]]<</if>></p> <p></p> <p class='narrow'><<if setup.ALIAS.canDo('TRAIN', 'walk', 120/60, 1.0, $G.PC) >>[[WALK SOMEWHERE]]<</if>></p> <p class='narrow'><<if setup.ALIAS.canDo('EXPLORE', 'search', 30/60, 1.0, $G.PC) >>[[LOOK FOR CHANGE]]<</if>></p> <p></p> <p class='narrow'><<if setup.ALIAS.canDo('TRAIN', 'walk', 5/60, 0.5, $G.PC) >>[[GO FOR A WALK]]<</if>></p> <p class='narrow'><<if setup.ALIAS.canDo('TRAIN', 'jog', 5/60, 0.5, $G.PC) >>[[GO FOR A JOG]]<</if>></p> <p class='narrow'><<if setup.ALIAS.canDo('TRAIN', 'run', 5/60, 0.5, $G.PC) >>[[GO FOR A RUN]]<</if>></p> <p></p> <p class='narrow'><<if setup.ALIAS.canDo('TRAIN', 'calisthenics', 5/60, 0.5, $G.PC) >>[[DO CALISTHENICS]]<</if>></p>
<<include 'NAVIGATION'>>
<<print setup.ENCOUNTERS.NAVIGATION.CHOICES.known_places();>> <p></p> <p></p> <p class='narrow keypress' key='[ESC]'>[[BACK HOME->GO HOME]]</p>
<<if !_power>> <br/><br/><br/><br/><br/> <div class='powers'><<print setup.ALIAS.listPowers($G.PC);>></div> <p></p> <p></p> <p class='keypress' key='[ESC]'><<link 'RETURN'>> <<run if('GO HOME'==State.passage) { Engine.play(State.passage, true); } setup.ALIAS.menuHide(); >> <</link>></p> <<else>> <div class='powers'><<print setup.ALIAS.developPower(_power, $G.PC);>></div> <p></p> <p></p> <p class='keypress' key='[ESC]'><<link 'RETURN'>> <<unset _power>> <<run setup.ALIAS.menuShow('powers');>> <</link>></p> <</if>>
<<set setup.POWERS={ 'xSTR' :{ 'label' : 'Super-Strength', 'base':'STR', }, 'xPHY' :{ 'label' : 'Super-Physique', 'base':'PHY', }, 'xWSD' :{ 'label' : 'Super-Wisdom', 'base':'WSD', }, 'xEND' :{ 'label' : 'Super-Endurance', 'base':'END', }, 'xSPD' :{ 'label' : 'Super-Speed', 'base':'SPD', }, 'xINS' :{ 'label' : 'Super-Instinct', 'base':'INS', }, 'Amazonian Blood' :{ 'label' : '[WiP] Amazonian Blood', 'base':'STR', }, 'Olympian Physique' :{ 'label' : '[WiP] Olympian Physique', 'base':'PHY', }, 'True Sight' :{ 'label' : '[WiP] True Sight', 'base':'WSD', }, 'Immortality' :{ 'label' : '[WiP] Immortality', 'base':'END', }, 'Time Dilation' :{ 'label' : '[WiP] Time Dilation', 'base':'SPD', }, 'Genius' :{ 'label' : '[WiP] Genius', 'base':'INS', }, 'Hyper Endowment *' :{ 'label' : '[WiP] Hyper Endowment *', 'base':'*', }, 'Shifting' :{ 'label' : '[WiP] Shifting *', 'base':'*', }, 'Size-Shifting' :{ 'label' : '[WiP] Size-', 'base':'*', }, 'Shape-Shifting' :{ 'label' : '[WiP] Shape-', 'base':'*', }, 'Form-Shifting' :{ 'label' : '[WiP] Form- *', 'base':'*', }, '[Flexology]' :{ 'label' : '[WiP] Flexology', 'base':'PHY', }, 'Pyros' :{ 'label' : '[WiP] Pyros', 'base':'SPD', }, 'Geos' :{ 'label' : '[WiP] Geos', 'base':'END', }, 'Aeros' :{ 'label' : '[WiP] Aeros', 'base':'WSD', }, 'Cryos' :{ 'label' : '[WiP] Cryos', 'base':'PHY', }, 'Hydros' :{ 'label' : '[WiP] Hydros', 'base':'STR', }, 'Elektros' :{ 'label' : '[WiP] Elektros', 'base':'INS', }, 'Psi-Factor' :{ 'label' : '[WiP] Psi-Factor', 'base':'*', }, 'Magick' :{ 'label' : '[WiP] Magick', 'base':'*', }, '[Bending]' :{ 'label' : '[WiP] [Bending]', 'base':'*', }, 'Blood-Magic' :{ 'label' : '[WiP] Blood-Magic', 'base':'*', }, /* END setup.POWERS */ }>>
<<set _S = setup.ALIAS.statGet('all', 'current', $G.PC);>> <div class='left framed'> <h4>STATS / ENERGY</h4> <table class='stats' style='font-size: 0.9em;'> <tr> <th><<print setup.ALIAS.karmic_link('STR', $G.PC)>>:</th> <th><<print setup.ALIAS.statPrint('STR', $G.PC); >></th> </tr> <tr> <th><<print setup.ALIAS.karmic_link('PHY', $G.PC)>>:</th> <th><<print setup.ALIAS.statPrint('PHY', $G.PC); >></th> </tr> <tr> <th><<print setup.ALIAS.karmic_link('WSD', $G.PC)>>:</th> <th><<print setup.ALIAS.statPrint('WSD', $G.PC); >></th> </tr> <tr> <th><<print setup.ALIAS.karmic_link('END', $G.PC)>>:</th> <th><<print setup.ALIAS.statPrint('END', $G.PC); >></th> </tr> <tr> <th><<print setup.ALIAS.karmic_link('SPD', $G.PC)>>:</th> <th><<print setup.ALIAS.statPrint('SPD', $G.PC); >></th> </tr> <tr> <th><<print setup.ALIAS.karmic_link('INS', $G.PC)>>:</th> <th><<print setup.ALIAS.statPrint('INS', $G.PC); >></th> </tr> <tr class='spacer'><td colspan='2'><hr /></td></tr> <tr style='font-size: 0.75em'> <td>lv [cal]:</td> <td><<print (_S.level).toFixed(0)+" ["+(_S.caliber).toFixed(0)+"]">></td> </tr> <tr class='spacer'><td colspan='2'><hr /></td></tr> <tr> <td>Tone %:</td> <td><<print setup.ALIAS.char_metric('bodytone', $G.PC)>></td> </tr> <tr> <td>Fat %:</td> <td><<print setup.ALIAS.char_metric('bodyfat', $G.PC)>></td> </tr> </table> <hr /> <div class='resources'> <<print setup.ALIAS.getResource('light', $G.PC) >> <<print setup.ALIAS.getResource('dark', $G.PC) >> <<print setup.ALIAS.getResource('qi', $G.PC) >> <hr /> <<if settings.lod_energyMatrix>> <div class='energy-matrix half-glass'> <<print setup.ALIAS.getResource('vigor', $G.PC) >> <<print setup.ALIAS.getResource('train', $G.PC) >> <<print setup.ALIAS.getResource('tough', $G.PC) >> <<print setup.ALIAS.getResource('power', $G.PC) >> <<print setup.ALIAS.getResource('skill', $G.PC) >> <<print setup.ALIAS.getResource('aware', $G.PC) >> <<print setup.ALIAS.getResource('vital', $G.PC) >> <<print setup.ALIAS.getResource('metab', $G.PC) >> <<print setup.ALIAS.getResource('focus', $G.PC) >> <<print setup.ALIAS.getResource('guard', $G.PC) >> <<print setup.ALIAS.getResource('react', $G.PC) >> <<print setup.ALIAS.getResource('psych', $G.PC) >> <<print setup.ALIAS.getResource('regen', $G.PC) >> <<print setup.ALIAS.getResource('force', $G.PC) >> <<print setup.ALIAS.getResource('fight', $G.PC) >> </div> <</if>> </div> <div> <h4>CONDITION:</h4> <<print setup.ALIAS.listConditions($G.PC); >> </div> </div>
<<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<set _dept = "D09">><<include 'LIST AISLES FOR DEPT'>> <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>>
<<set /* Content-build for X-Website... */ setup.ALIAS.contentSite = 'deviantArt'; /* deviantArt allows nudity, but no sexual acts */ /* other builds may be targeted for patreon, furaffinity, tumblr, and hentaiFoundry */ /* available adult content will vary from site-build to site-build */ >>
<<run setup.ALIAS.modVersion="?"; >>
<h2>HardLife v0.26 - Guide:</h2> <<if !_topic>> <ul class='guide-menu'> <li><<topic 'About the Game' >><<subtopics `['NEW', 'public version', 'supporter version', 'credits', 'how you can help']`>></li> <li><<topic 'PLAYABLE CHARACTERS' >><<subtopics `['Cindy Phoenix', 'Tammi X', 'Sue Marien', 'Leona Lee', 'Lisa Irons', 'Play as Slave']`>></li> <li><<topic 'STATS' >><<subtopics `['STR', 'PHY', 'WSD', 'END', 'SPD', 'INS', 'super-stats', 'stat-modifiers']`>></li> <li><<topic 'ENERGIES' >><<subtopics `['vigor', 'train', 'tough', 'power', 'skill', 'aware', 'vital', 'metab', 'focus', 'guard', 'react', 'psych', 'regen', 'force', 'fight' ]`>></li> <li><<topic 'KARMA' >><<subtopics `['light', 'dark']`>></li> <li class='disabled'><<topic 'COMBAT' >><<subtopics `['COMBAT ACTIONS', 'POST COMBAT']`>></li> <li><<topic 'COMBAT ACTIONS' >><<subtopics `['Punch', 'Kick', 'Slap', 'Headbutt', 'Guard Action', 'Rest Action', 'Fleeing']`>></li> <li class='disabled'><<topic 'POST COMBAT' >><<subtopics `['beta: heal action', 'beta: drain/feed action', 'taking slaves']`>></li> <li class='disabled'><<topic 'SLAVES' >><<subtopics `[]`>></li> <!-- <li class='disabled'><<topic 'SEX' >><<subtopics `[]`>></li> --> <li class='disabled'><<topic 'BODY' >><<subtopics `['body-fat', 'muscle', 'muscle-condition', 'muscle-damage', 'muscle-fatigue', 'muscle-tone', 'limbs', 'wounds']`>></li> <li class='disabled'><<topic 'METRICS' >><<subtopics `['age', 'height', 'weight', 'cup size', 'chest size', 'waist size', 'hip size', 'bicep size', 'forearm size', 'quad size', 'calf size']`>></li> <li class='disabled'><<topic 'WEIGHT' >><<subtopics `['bone mass','fat mass','muscle mass','organ mass']`>></li> <li><<topic 'MUSCLES' >><<subtopics `['Calves', 'Quads', 'Hamstrings', 'Glutes', 'Hips', 'Lower Back', 'Lats', 'Traps', 'Abs', 'Pecs', 'Delts', 'Triceps', 'Biceps', 'Forearms', 'Grip', 'Cardio', 'Kegel']`>></li> <li class='disabled'><<topic 'WORKOUTS' >><<subtopics `['walking', 'jogging', 'running', 'calisthenics', 'aerobics', 'yoga', 'weightlifting', 'crossfit', 'powerlifting']`>></li> <li class='disabled'><<topic 'GYM' >><<subtopics `['BALANCED ROUTINES', 'CLASSES', 'CARDIO MACHINES', 'PT AREA', 'CROSSFIT', 'LIFT STATIONS', 'WORKOUT LOADS']`>></li> <li><<topic 'WORKOUT LOADS' >><<subtopics `['WORK HEAVY/FAST', 'BURNOUT/MAX REPS', 'WARM UP/LIGHT TONE', 'SLOW REPS/MAX FLEX', 'GO FOR MAX LIFT', 'PROPER TECHNIQUE']`>></li> <li><<topic 'PT AREA' >><<subtopics `['Back Extension', 'Crunch', 'Dips', 'Leg Raise', 'Lunge', 'Pull-up', 'Push-up']`>></li> <li><<topic 'LIFT STATIONS' >><<subtopics `['Bench Press', 'Bent-over Row', 'Biceps Curl', 'Calf Raise', 'Chest Fly', 'Deadlift', 'Lateral Raise', 'Leg Curl', 'Leg Extension', 'Leg Press', 'Military Press', 'Pull-down', 'Shoulder Shrug', 'Squat', 'Triceps Extension', 'Upright Row', 'Wrist Curl']`>></li> <li class='disabled'><<topic 'ITEMS' >><<subtopics `['FOOD', 'CLOTHING', 'shards']`>></li> <li class='disabled'><<topic 'FOOD' >><<subtopics `['water', 'produce', 'junk food', 'meat']`>></li> <li class='disabled'><<topic 'CLOTHING' >><<subtopics `[]`>></li> <li class='disabled'><<topic 'EXPLORATION' >><<subtopics `['looking for change']`>></li> <li class='disabled'><<topic 'NPCS' >><<subtopics `['fighting', 'flirting', 'talking']`>></li> <li><<topic 'POWERS' >><<subtopics `['super-stats']`>></li> <li class='disabled'><<topic 'SKILLS' >><<subtopics `[]`>></li> <li class='disabled'><<topic 'TRAVEL' >><<subtopics `[]`>></li> </ul> <p></p> <p></p> <p></p> <p class='keypress' key='[ESC]'><<link 'RETURN'>><<run setup.ALIAS.menuHide();>><</link>></p> <<else>> <h3>_topic</h3> <<switch _topic>> <<case 'About the Game' >> <p>[<sss>_topic</sss>]</p> <p>What's <<topic 'NEW'>></p> <p><<topic 'public version'>></p> <p><<topic 'supporter version'>></p> <p><<topic 'credits'>></p> <p><<topic 'how you can help'>></p> <<case 'NEW' >> <p>[<sss><<topic 'About the Game'>> > _topic</sss>]</p> <p></p> <p></p> <p></p> <p></p> <p></p> <p></p> <p>Life-Shards and Blood-Shards can now be farmed and exchanged for powerful items.</p> <<case 'public version' >> <p>[<sss><<topic 'About the Game'>> > _topic</sss>]</p> <p>Currently includes the following features and content:</p> <p>Basic/Generic <<topic 'WORKOUTS'>>, including <<topic 'Walking'>>, <<topic 'Jogging'>>, <<topic 'Running'>>, <<topic 'Calisthenics'>>, <<topic 'Aerobics'>>, and <<topic 'Yoga'>> (space permitting)</p> <p>A partial <<topic 'GYM'>>, including a <<topic 'PT Area'>> for common <<topic 'Calisthenics'>> workouts and <<topic 'Lift Stations'>> for common <<topic 'Weightlifting'>> exercises (though there is currently no upper limit to the amount of resistance the machines can provide)</p> <p>A store and <<topic 'ITEM'>> system with <<topic 'CLOTHING'>> and basic <<topic 'FOOD'>> items</p> <p>An advanced, but easy to master, core system with 6 general <<topic 'STATS'>> which generate a matrix of 15 secondary stats or <<topic 'ENERGIES'>></p> <p>Text and UI styling that allows additional information to be embedded with the text, such as inflections or hidden details</p> <p>Basic turn-based <<topic 'COMBAT'>> with <<topic 'POST COMBAT'>> options including taking <<topic 'SLAVES'>> and the <<topic 'beta: drain/feed action'>></p> <p>Basic Slave Interactions, including the ability to heal, drain, and feed them, as well as fight them again.</p> <<case 'supporter version' >> <p>[<sss><<topic 'About the Game'>> > _topic</sss>]</p> <p>Includes all the features of the current <<topic 'public version'>>, plus any alpha features in early testing and other content previews not yet ready for the general public...</p> <p>Also Includes a built-in Cheats Menu with following Cheats: <ul class='topics'> <li>Adventurer Mode - Search yields greatly enhanced. (for now that means you'll find about 10x as much money from searching the parking lot)</li> <li>Alchemist Mode - Item effects greatly enhanced. (energy-matrix effects of food and other consumables is 10x base value, calories and nutritional value, however, remain unchanged. Once transformative items are added to the game, this code should be really fun.)</li> <li>Artisan Mode - Item use-count never depeltes.</li> <li>Athlete Mode - Exercise gains greatly enhanced. (boosts gains from basic exercises by a factor of 10x, does not yet affect single-stat bonus gained from gym lifts)</li> <li>Banker Mode - Buy without actually paying. (just give the cashier a little piece of paper saying you loaned them the money, and come back and take the store under default when they are late on a payment ;p)</li> <li>God Mode - Energy never drops below full and you cannot be killed or knocked unconsious by a lesser being. (for now that means all other beings, though in future versions you may encounter other gods or eternal beings that can still kick your ass)</li> <li>Guru/Zen Mode - Light Karma never drops below full. Healing surges greatly enhanced.</li> <li>Luck Mode - Event Rates Reversed. (rare-encounters become the norm, and common encounters are nearly unheard of)</li> <li>Oni/Raaksha Mode - Dark Karma never drops below full. Power drain greatly enhanced.</li> <li>Slacker Mode - Recovery from resting greatly enhanced. (recover expended energy and heal damage 10x as quickly)</li> <li>Venus Mode - Makes everyone young and amorous. (well, young anyway, amour will have to wait for future versions...)</li> </ul> </p> <p></p> <p>And exclusive content and characters like <<topic 'Lisa Irons'>> (mentioned in Chapter 10 of Dreyanna: Rebirth of a Goddess, and in the process of getting her own full storyline), that begin as powerful amazons with unique abilities. (currently Lisa is the only such character, and the powers system is a work in progress- but she does have 5 ranks in <<topic 'Super-Strength'>>, 3 ranks in <<topic 'Super-Physique'>> & <<topic 'Super-Endurance'>>, 2 ranks in <<topic 'Super-Instinct'>>, and 1 rank in <<topic 'Super-Speed'>> & <<topic 'Super-Wisdom'>>)</p> <<case 'credits'>> <p>[<sss><<topic 'About the Game'>> > _topic</sss>]</p> <p>Design, System, Writing, & Coding: ShadowRx</p> <p>Support & Testing: <ul class='topics'> <li>RocketNow</li> <li>Red Viking</li> <li>Aunt Kathy</li> <li>Ninjafirevax</li> <li>NadezhdaFex</li> <li>Radical One</li> <li>Martin Schröder</li> <li>Araktosh</li> <li>S.D.</li> <li>ericsongs</li> <li>Nexvinco</li> </ul> </p> <<case 'how you can help'>> <p>[<sss><<topic 'About the Game'>> > _topic</sss>]</p> <p>The most obvious way is to become a supporter on <a target='_blank' href='https://www.patreon.com/ShadowRx'>Patreon</a> (for as little as $1) and gain access to the Cheats system and other exclusive content from the <<topic 'supporter version'>>, as well as more control over the direction and content of the game (like being able to add items, NPCs, and playable characters to the game). I am trying to transition to being a full-time developer/artist, and any help is greatly appreciated.</p> <p></p> <p>Other ways include beta testing and leaving feedback on the game. Positive or negative, what do you like, what feature do you most want to see, what could be done better, and what do you hate? Comments let the artists and authors know there are people who care about the work, and who wish to see more of it. It's easy for creative people to get discouraged and drown in the sea of silence their best works so often generate. Some of us even neurotically check the number of views and favorites a piece gets every hour for the first week after we submit it... all the while hoping someone will notice and comment about that one subtle detail we added. (though by the end of that week, we'd often settle for someone just shouting BEWBS!)</p> <p></p> <p>And, of course, spread the word! If you like a game, share it with others you think might like it too. The more interest a developer sees, the more effort and time they'll set aside for the project.</p> <<case 'PLAYABLE CHARACTERS'>> <p>[<sss>_topic</sss>]</p> <p>Currently playable characters include <<topic 'Cindy Phoenix'>>, <<topic 'Tammi X'>>, <<topic 'Sue Marien'>>, and <<topic 'Leona Lee'>> in the <<topic 'public version'>>, plus <<topic 'Lisa Irons'>> in the <<topic 'supporter version'>>, and will soon include the ability to '<<topic 'Play as Slave'>>', allowing you to take control of anyone currently in your battle-harem.</p> <<case 'Cindy Phoenix' >> <p>[<sss><<topic 'PLAYABLE CHARACTERS'>> > _topic</sss>]</p> <table class='guide'><caption>Base Stats:</caption><tbody> <tr><th>stat</th><th>level</th><th>rank</th><th>effective-level</th></tr> <tr><th><span class='statval STR'><<topic 'STR'>></span></th><th> 5/21</th><th>-</th><th> 5/21</th></tr> <tr><th><span class='statval PHY'><<topic 'PHY'>></span></th><th> 5/21</th><th>3</th><th> 20/21</th></tr> <tr><th><span class='statval WSD'><<topic 'WSD'>></span></th><th> 5/21</th><th>-</th><th> 5/21</th></tr> <tr><th><span class='statval END'><<topic 'END'>></span></th><th> 5/21</th><th>-</th><th> 5/21</th></tr> <tr><th><span class='statval SPD'><<topic 'SPD'>></span></th><th> 5/21</th><th>-</th><th> 5/21</th></tr> <tr><th><span class='statval INS'><<topic 'INS'>></span></th><th> 5/21</th><th>-</th><th> 5/21</th></tr> </tbody></table> <p>Born Cindy Williams of Tulsa, Oklahoma, she made her film debut five years ago in the indie slasher flick <i>Zombies have no Brains</i>, under the screen name Cindy Campbell. She worked on several other small projects before landing the lead role in <i>Werewolf II: Bitch in Heat</i>, but was replaced six weeks in, when she had a heated disagreement with her longtime boyfriend and director, Nick James.</p> <p>Left with nothing after the breakup, Cindy was horrified to learn the Trust he said he was depositing her pay and cut into didn't even exist. Now, with no home and nowhere else to turn, Cindy lives in her car in the S-Mart parking lot. With no money, and well below average stats, she has a difficult road ahead of her. Can she rise up out of the ashes of her former life to become the Hollywood star of her childhood dreams?</p> <p>One thing is certain, she would need a new name for her new life, and one night as she lay awake in her car it came to her...</p> <p>Star actress wasn't enough, not anymore. She was tired of feeling helpless while the men in her life got to do whatever they wanted, even to her. No. No more. She wasn't just going to be some pretty face, she was taking control of her life AND her career. She wasn't going to play the helpless girlfriend that gets killed in Act II anymore! She was going to be the hero, the films were going to be about HER! Action Mega-Star CINDY PHOENIX!</p> <p>But she has a long way to go, and she'll need a lot of money and time to build the perfect body of her destiny...</p> <<case 'Tammi X' >> <p>[<sss><<topic 'PLAYABLE CHARACTERS'>> > _topic</sss>]</p> <table class='guide'><caption>Base Stats:</caption><tbody> <tr><th>stat</th><th>level</th><th>rank</th><th>effective-level</th></tr> <tr><th><span class='statval STR'><<topic 'STR'>></span></th><th> 7/21</th><th>-</th><th> 7/21</th></tr> <tr><th><span class='statval PHY'><<topic 'PHY'>></span></th><th> 7/21</th><th>-</th><th> 7/21</th></tr> <tr><th><span class='statval WSD'><<topic 'WSD'>></span></th><th> 10/21</th><th>-</th><th> 10/21</th></tr> <tr><th><span class='statval END'><<topic 'END'>></span></th><th> 25/21</th><th>3</th><th>100/21</th></tr> <tr><th><span class='statval SPD'><<topic 'SPD'>></span></th><th> 8/21</th><th>-</th><th> 8/21</th></tr> <tr><th><span class='statval INS'><<topic 'INS'>></span></th><th> 10/21</th><th>-</th><th> 10/21</th></tr> </tbody></table> <p>Tired of his shit, of getting hit for the thousandth time, she finally left that asshole... but not before getting beaten nearly to death. Somehow Tammi mustered the strength to get back up, and escaped while Jason was out drinking.</p> <p>A former high school athlete, and long-time victim of abuse, Tammi has extrodinary endurance and pretty decent stats overall, even if she has let herself go a little these past five years. But she has alot of healing to do before she's can regain her former figure. </p> <p>With no car, she caught a bus to a new city, to begin her new life with just $200 in her pocket. Can she become the athlete she once was, or is she trapped in a cycle of abusive relationships?</p> <p>With her wrestling skills and almost obscene degree of toughness, she can hold her own against opponents over twice her size. Tammi could make one hell of a fighter with the right training, and a dark place deep inside longs to share some of the pain that life has given her. But wrestling alone wouldn't be enough, she needed to learn how to strike and block if she was to have her revenge against Jason. He had been an ametuer boxer in his youth; he wasn't all that good, hell she heard he had a glass chin and that's why he quit, but he did learn how to throw a punch, as her enumerable bruises and blackouts can attest.</p> <p>Maybe that's it... that's what she needed to learn, how to box. And someday she could go back and smash HIS face in... a sickening grin spread across her face as she surrendered to her inner darkness. This might just be... fun, she sneered as she punched the motel wall.</p> <<case 'Sue Marien' >> <p>[<sss><<topic 'PLAYABLE CHARACTERS'>> > _topic</sss>]</p> <table class='guide'><caption>Base Stats:</caption><tbody> <tr><th>stat</th><th>level</th><th>rank</th><th>effective-level</th></tr> <tr><th><span class='statval STR'><<topic 'STR'>></span></th><th> 16/33</th><th>3</th><th> 64/33</th></tr> <tr><th><span class='statval PHY'><<topic 'PHY'>></span></th><th> 7/33</th><th>-</th><th> 7/33</th></tr> <tr><th><span class='statval WSD'><<topic 'WSD'>></span></th><th> 9/33</th><th>-</th><th> 9/33</th></tr> <tr><th><span class='statval END'><<topic 'END'>></span></th><th> 8/33</th><th>-</th><th> 8/33</th></tr> <tr><th><span class='statval SPD'><<topic 'SPD'>></span></th><th> 9/33</th><th>-</th><th> 9/33</th></tr> <tr><th><span class='statval INS'><<topic 'INS'>></span></th><th> 7/33</th><th>-</th><th> 7/33</th></tr> </tbody></table> <p>...</p> <p>...</p> <p>...</p> <<case 'Leona Lee' >> <p>[<sss><<topic 'PLAYABLE CHARACTERS'>> > _topic</sss>]</p> <table class='guide'><caption>Base Stats:</caption><tbody> <tr><th>stat</th><th>level</th><th>rank</th><th>effective-level</th></tr> <tr><th><span class='statval STR'><<topic 'STR'>></span></th><th> 18/15</th><th>1</th><th> 36/15</th></tr> <tr><th><span class='statval PHY'><<topic 'PHY'>></span></th><th> 17/15</th><th>-</th><th> 17/15</th></tr> <tr><th><span class='statval WSD'><<topic 'WSD'>></span></th><th> 8/15</th><th>-</th><th> 8/15</th></tr> <tr><th><span class='statval END'><<topic 'END'>></span></th><th> 18/15</th><th>-</th><th> 18/15</th></tr> <tr><th><span class='statval SPD'><<topic 'SPD'>></span></th><th> 18/15</th><th>1</th><th> 36/15</th></tr> <tr><th><span class='statval INS'><<topic 'INS'>></span></th><th> 22/15</th><th>1</th><th> 44/15</th></tr> </tbody></table> <p>...</p> <p>...</p> <p>...</p> <<case 'Lisa Irons' >> <p>[<sss><<topic 'PLAYABLE CHARACTERS'>> > _topic</sss>]</p> <table class='guide'><caption>Base Stats:</caption><tbody> <tr><th>stat</th><th>level</th><th>rank</th><th>effective-level</th></tr> <tr><th><span class='statval STR'><<topic 'STR'>></span></th><th>60/120</th><th>5</th><th>300/120</th></tr> <tr><th><span class='statval PHY'><<topic 'PHY'>></span></th><th>60/120</th><th>3</th><th>240/120</th></tr> <tr><th><span class='statval WSD'><<topic 'WSD'>></span></th><th>60/120</th><th>1</th><th>120/120</th></tr> <tr><th><span class='statval END'><<topic 'END'>></span></th><th>60/120</th><th>3</th><th>240/120</th></tr> <tr><th><span class='statval SPD'><<topic 'SPD'>></span></th><th>60/120</th><th>1</th><th>120/120</th></tr> <tr><th><span class='statval INS'><<topic 'INS'>></span></th><th>60/120</th><th>2</th><th>180/120</th></tr> </tbody></table> <p>Lieutenant Lisa Victoria Irons III, daughter of the late Commodore Victoria Irons II (the Hero of the Battle of Vealor IV and most imposing woman in the fleet), has spent her entire career trying to step out from her mother's massive shadow. She has risen through the ranks and honed her body and skills to a level of perfection rarely seen, even among her own powerful people.</p> <p>Stonger than a hundred of her own men, she now finds herself stranded ten thousand lightyears from home, on a world that barely has the technology to leave its own atmosphere. How many centuries, she wonders, would it take for her to reach a civilized system from which to travel home to Aldenea?</p> <p>It did not take her long to realize just how fragile and slow the locals were... even for males. If she wanted, she could probably take over this entire world; perhaps then she could steer their development toward the stars in the hopes of someday returning home. One thing was clear, she would need to survey this world and assess her resources before she could make any plans. And she was fairly certain she wouldn't be welcomed in many the places she needed to see.</p> <<case 'Play as Slave' >> <p>[<sss><<topic 'PLAYABLE CHARACTERS'>> > _topic</sss>]</p> <p>A feature will soon be added that allows character-switching; once available you'll be able to play as any of your caputured slaves.</p> <<case 'STATS' >> <p>[<sss>_topic</sss>]</p> <p><span class='statval STR'><<topic 'STR'>></span> (Strength) - your level of muscle</p> <p><span class='statval PHY'><<topic 'PHY'>></span> (Physique) - your level of fitness</p> <p><span class='statval WSD'><<topic 'WSD'>></span> (Wisdom) - your ability to avoid harm/change</p> <p><span class='statval END'><<topic 'END'>></span> (Endurance) - your level of resiliance</p> <p><span class='statval SPD'><<topic 'SPD'>></span> (Speed) - the rate at which you experience time and can act</p> <p><span class='statval INS'><<topic 'INS'>></span> (Instinct) - your ability to inflict harm/change</p> <p></p> <p><<topic 'Lv'>> - your overall level is the average of all six stats</p> <p><<topic 'Cal'>> - your caliber is the triangular base/root of your level, it is used in several formulas to provide a roughly x^1.5 exponential, or logarithmic curve. Among many other things it is used to determine the number and value of units in both your <<topic 'BODY'>> conditioning/training (<<topic 'muscle-tone'>>) and your levels for the upcoming <<topic 'POWERS'>> and <<topic 'SKILLS'>> systems.</p> <p></p> <!-- <p>Stat-power example using Strength by overall stat-level: <ul class='topics'> <li>005 (Cindy) is very low, almost childlike. Most people pass this level around puberty. This would indicate an unaided bench-press of about 25 pounds.</li> <li>007 is common among inactive people who spend most of their day sitting. This would indicate an unaided bench-press of about 50 pounds.</li> <li>010 (Tammi) is considered a fit-average for all stats. This would indicate an unaided bench-press of about 100 pounds.</li> <li>020 is generally reserved for eliete athletes. This would indicate an unaided bench-press of about 400 pounds.</li> <li>030 puts one at the very pinacle of human achievement. This would indicate an unaided bench-press of about 900 pounds, which is almost 200 pounds over the current record.</li> <li>045 or higher is only common in myths and legends. This would indicate an unaided bench-press of more than a ton.</li> <li>120 (Lisa) puts one into comic book super-strength territory (even without said-named power). This would indicate an unaided bench-press of about seven tons.</li> <li>320 puts one into the upper echelon of comic book super-strength. This would indicate an unaided bench-press of over 100 tons. Of course, we're really only getting started... the game has no upper limit on power levels (except what crashes javascript somewhere around 10^300+)</li> </ul> </p> --> <<case 'STR' >> <p>[<sss><<topic 'STATS'>> > _topic</sss>]</p> <p>Strength</p> <p>Aligns with the element of Water/Pressure</p> <p>combines with other stats to create the following energies:</p> <p><span class='statval STR'>STR</span> x <span class='statval INS'><<topic 'INS'>></span> = <<topic 'skill'>></p> <p><span class='statval STR'>STR</span> x <span class='statval SPD'><<topic 'SPD'>></span> = <<topic 'power'>></p> <p><span class='statval STR'>STR</span> x <span class='statval END'><<topic 'END'>></span> = <<topic 'tough'>></p> <p><span class='statval STR'>STR</span> x <span class='statval WSD'><<topic 'WSD'>></span> = <<topic 'train'>></p> <p><span class='statval STR'>STR</span> x <span class='statval PHY'><<topic 'PHY'>></span> = <<topic 'vigor'>></p> <p>Raised by: using any of the above energies, selecting the <<topic 'GO FOR MAX LIFT'>> load in gym workouts, winning fights, draining opponents/slaves</p> <<case 'PHY' >> <p>[<sss><<topic 'STATS'>> > _topic</sss>]</p> <p>Physique</p> <p>Aligns with the element of Ice/Crystal</p> <p>combines with other stats to create the following energies:</p> <p><span class='statval PHY'>PHY</span> x <span class='statval STR'><<topic 'STR'>></span> = <<topic 'vigor'>></p> <p><span class='statval PHY'>PHY</span> x <span class='statval INS'><<topic 'INS'>></span> = <<topic 'focus'>></p> <p><span class='statval PHY'>PHY</span> x <span class='statval SPD'><<topic 'SPD'>></span> = <<topic 'metab'>></p> <p><span class='statval PHY'>PHY</span> x <span class='statval END'><<topic 'END'>></span> = <<topic 'vital'>></p> <p><span class='statval PHY'>PHY</span> x <span class='statval WSD'><<topic 'WSD'>></span> = <<topic 'aware'>></p> <p>Raised by: using any of the above energies, selecting the <<topic 'SLOW REPS/MAX FLEX'>> load in gym workouts, winning fights, draining opponents/slaves</p> <<case 'WSD' >> <p>[<sss><<topic 'STATS'>> > _topic</sss>]</p> <p>Wisdom</p> <p>Aligns with the element of Air/Void</p> <p>combines with other stats to create the following energies:</p> <p><span class='statval WSD'>WSD</span> x <span class='statval PHY'><<topic 'PHY'>></span> = <<topic 'aware'>></p> <p><span class='statval WSD'>WSD</span> x <span class='statval STR'><<topic 'STR'>></span> = <<topic 'train'>></p> <p><span class='statval WSD'>WSD</span> x <span class='statval INS'><<topic 'INS'>></span> = <<topic 'psych'>></p> <p><span class='statval WSD'>WSD</span> x <span class='statval SPD'><<topic 'SPD'>></span> = <<topic 'react'>></p> <p><span class='statval WSD'>WSD</span> x <span class='statval END'><<topic 'END'>></span> = <<topic 'guard'>></p> <p>Raised by: using any of the above energies, selecting the <<topic 'WARM UP/LIGHT TONE'>> load in gym workouts, winning fights, draining opponents/slaves</p> <<case 'END' >> <p>[<sss><<topic 'STATS'>> > _topic</sss>]</p> <p>Endurance</p> <p>Aligns with the element of Earth/Sound</p> <p>combines with other stats to create the following energies:</p> <p><span class='statval END'>END</span> x <span class='statval WSD'><<topic 'WSD'>></span> = <<topic 'guard'>></p> <p><span class='statval END'>END</span> x <span class='statval PHY'><<topic 'PHY'>></span> = <<topic 'vital'>></p> <p><span class='statval END'>END</span> x <span class='statval STR'><<topic 'STR'>></span> = <<topic 'tough'>></p> <p><span class='statval END'>END</span> x <span class='statval INS'><<topic 'INS'>></span> = <<topic 'force'>></p> <p><span class='statval END'>END</span> x <span class='statval SPD'><<topic 'SPD'>></span> = <<topic 'regen'>></p> <p>Raised by: using any of the above energies, selecting the <<topic 'BURNOUT/MAX REPS'>> load in gym workouts, winning fights, draining opponents/slaves</p> <<case 'SPD' >> <p>[<sss><<topic 'STATS'>> > _topic</sss>]</p> <p>Speed</p> <p>Aligns with the element of Fire/Heat</p> <p>combines with other stats to create the following energies:</p> <p><span class='statval SPD'>SPD</span> x <span class='statval END'><<topic 'END'>></span> = <<topic 'regen'>></p> <p><span class='statval SPD'>SPD</span> x <span class='statval WSD'><<topic 'WSD'>></span> = <<topic 'react'>></p> <p><span class='statval SPD'>SPD</span> x <span class='statval PHY'><<topic 'PHY'>></span> = <<topic 'metab'>></p> <p><span class='statval SPD'>SPD</span> x <span class='statval STR'><<topic 'STR'>></span> = <<topic 'power'>></p> <p><span class='statval SPD'>SPD</span> x <span class='statval INS'><<topic 'INS'>></span> = <<topic 'fight'>></p> <p>Raised by: using any of the above energies, selecting the <<topic 'WORK HEAVY/FAST'>> load in gym workouts, winning fights, draining opponents/slaves</p> <<case 'INS' >> <p>[<sss><<topic 'STATS'>> > _topic</sss>]</p> <p>Instinct</p> <p>Aligns with the element of Lightning/Magnetism</p> <p>combines with other stats to create the following energies:</p> <p><span class='statval INS'>INS</span> x <span class='statval SPD'><<topic 'SPD'>></span> = <<topic 'fight'>></p> <p><span class='statval INS'>INS</span> x <span class='statval END'><<topic 'END'>></span> = <<topic 'force'>></p> <p><span class='statval INS'>INS</span> x <span class='statval WSD'><<topic 'WSD'>></span> = <<topic 'psych'>></p> <p><span class='statval INS'>INS</span> x <span class='statval PHY'><<topic 'PHY'>></span> = <<topic 'focus'>></p> <p><span class='statval INS'>INS</span> x <span class='statval STR'><<topic 'STR'>></span> = <<topic 'skill'>></p> <p>Raised by: using any of the above energies, selecting the <<topic 'PROPER TECHNIQUE'>> load in gym workouts, winning fights, draining opponents/slaves</p> <<case 'super-stats' >> <p>[<sss><<topic 'STATS'>> > _topic</sss>]</p> <p>Super-Stat powers are multiplicative ranks that increase your base stat levels and apply a special boost to some actions.</p> <p><span class='statval SPD'>Super-SPD</span> - improves chance to hit, evade, and run; also increases travel speed.</p> <p><span class='statval END'>Super-END</span> - reduces all forms of physical damage, including elemental exposure.</p> <p><span class='statval WSD'>Super-WSD</span> - increases chance to evade or mitigate attacks and dangerous situations.</p> <p><span class='statval PHY'>Super-PHY</span> - reduces stamina cost of exercises and increases maximum repititions, as a result it also increases max throw-distance, reduces damage from grapples.</p> <p><span class='statval STR'>Super-STR</span> - increases the amount of weight you can lift/wield/carry, and how far you can throw it, also increases melee and grapple damage.</p> <p><span class='statval INS'>Super-INS</span> - improves accuracy increasing chance to hit and crit, increasing attack damage.</p> <p></p> <<case 'stat-modifiers' >> <p>[<sss><<topic 'STATS'>> > _topic</sss>]</p> <p>Beyond your base-stats, which determine your level, there are a number of modifiers that affect overall stat values.</p> <p></p> <p><h2>PERMANENT MODIFIERS: (Trainable)</h2></p> <p>DRAIN - taken from/by others.</p> <p>EVOLVE - epigenetic stat points gained by adapting to dangerous situations, such as combat.</p> <p>GENES - genetic predisposition to certain stats. Very difficult to change.</p> <p>KARMA - gained/lost through the application of karma.</p> <p>PRIMAL - gained/lost through the exposure or depletion of Primal Energy.</p> <p>TRAIN - raised through study/training, or lost over time to idleness.</p> <p>HEALTH - gained from proper nutrition, an active lifestyle and a healthy living environment; lost by exposure to toxins, diseases, and unmanaged stress.</p> <p>ENERGY - represents the integrity of the elemental and molecular bonds that make up the material of your physical body.</p> <p></p> <p>Gaining or losing points in Permanent Modifiers will also slightly raise or lower your base stats, thus increasing your maximum capacity for Stat-Modifiers (+/-). In fact, this is pretty much the only way to change your base stats/raise your level.</p> <p></p> <p><h2>TEMPORARY MODIFIERS: (Buffs/Debuffs)</h2></p> <p>Status Conditions, in general, will often include stat-based effects</p> <p>Environmental Effects</p> <p>Diseases/Toxins</p> <p>Curses/Blessings</p> <p>Enchantments</p> <p></p> <p>There aren't many buffs/debuffs in the game as yet, but they are coming. As more effects are incorporated, a list of specific modifiers will be added to this section of the guide.</p> <p>It should be noted that the application of Temporary Modifiers also affects your base stats, but to a far lesser extent than exposure to Permanent Modifers.</p> <p></p> <p>The sum of all the modifiers, plus your base stats, and factoring in any super-stat powers, determines your final stat-levels.</p> <<case 'ENERGIES' >> <p>[<sss>_topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<topic 'Qi'>> </p> <p>...<<topic ''>>...</p> <p><<topic 'vigor'>> </p> <p><<topic 'train'>> </p> <p><<topic 'tough'>> </p> <p><<topic 'power'>> </p> <p><<topic 'skill'>> </p> <p><<topic 'aware'>> </p> <p><<topic 'vital'>> </p> <p><<topic 'metab'>> </p> <p><<topic 'focus'>> </p> <p><<topic 'guard'>> </p> <p><<topic 'react'>> </p> <p><<topic 'psych'>> </p> <p><<topic 'regen'>> </p> <p><<topic 'force'>> </p> <p><<topic 'fight'>> </p> <p>...<<topic ''>>...</p> <<case 'vigor' >> <p>[<sss><<topic 'ENERGIES'>> > _topic</sss>]</p> <p>Stamina/Vigor (<span class='statval STR'><<topic 'STR'>></span> x <span class='statval PHY'><<topic 'PHY'>></span>)</p> <p>This is the energy you have to get through your day, it is quickly depelted by heavily physical tasks, but also mentally-taxing ones; this and <<topic 'vital'>> are the two energies most dependant on sleep, and that is the fastest way to recover them. Eating food also helps considerably since this is aided by boosting your metabolism (<<topic 'metab'>>). This is essentially a measure of the present state of your slow-twitch muscles.</p> <p>Flows into: <<topic 'focus'>>, <<topic 'vital'>>, <<topic 'skill'>>, <<topic 'tough'>></p> <p>Flows from: <<topic 'metab'>>, <<topic 'aware'>>, <<topic 'power'>>, <<topic 'train'>></p> <p>Filled by: sleeping, eating healthy foods, raising <<topic 'Qi'>>.</p> <p>Drained by: taking damage, working out, or anything else that lowers <<topic 'Qi'>>.</p> <p>Increased by: anything that raises <<topic 'STR'>> and/or <<topic 'PHY'>>. Attacking. Working out. Running/Jogging. Calisthenics. Weightlifting.</p> <p>Combat role: Stamina used in combat-actions/attacks, and trying to run from/chase down opponents. Each round combat continues, the amount of stamina burned increases until your adrenal system can no longer keep up and you pass out from the stress and exhaustion. Taking the <<topic 'Rest Action'>>/<<topic 'Guard Action'>> during long battles is essential... raising your <<topic 'PHY'>> score will also reduce the amount of stamina you burn each round. Combat continues until someone is beaten, killed, escapes, surrenders (not yet implemented), or their body fails from lack of this energy. In extreme cases depletion can be fatal.</p> <<case 'train' >> <p>[<sss><<topic 'ENERGIES'>> > _topic</sss>]</p> <p>Training (<span class='statval STR'><<topic 'STR'>></span> x <span class='statval WSD'><<topic 'WSD'>></span>)</p> <p>Discipline/conditioning - essentially muscle memory.</p> <p>Flows into: <<topic 'aware'>>, <<topic 'guard'>>, <<topic 'tough'>>, <<topic 'vigor'>></p> <p>Flows from: <<topic 'psych'>>, <<topic 'react'>>, <<topic 'skill'>>, <<topic 'power'>></p> <p>Filled by: sleeping, eating healthy foods, raising <<topic 'Qi'>>.</p> <p>Drained by: taking damage, working out, or anything else that lowers <<topic 'Qi'>>.</p> <p>Increased by: anything that raises <<topic 'STR'>> and/or <<topic 'WSD'>>. Fighting. Working out. Calisthenics.</p> <p>Combat role: Currently only used to improve chance to flee/elude capture.</p> <<case 'tough' >> <p>[<sss><<topic 'ENERGIES'>> > _topic</sss>]</p> <p>Toughness (<span class='statval STR'><<topic 'STR'>></span> x <span class='statval END'><<topic 'END'>></span>)</p> <p>Resistance to damage and pain. If your toughness breaks before your foes, it's a pretty good indication you need to run (because the next hits that get through are going to be brutal).</p> <p>Flows into: <<topic 'force'>>, <<topic 'regen'>>, <<topic 'skill'>>, <<topic 'power'>></p> <p>Flows from: <<topic 'vital'>>, <<topic 'guard'>>, <<topic 'vigor'>>, <<topic 'train'>></p> <p>Filled by: sleeping, eating healthy foods, raising <<topic 'Qi'>>.</p> <p>Drained by: taking damage, working out, or anything else that lowers <<topic 'Qi'>>.</p> <p>Increased by: anything that raises <<topic 'STR'>> and/or <<topic 'END'>>. Taking damage. Working out. Calisthenics. Pushing yourself to the limit.</p> <p>Combat role: Base Defense Power - counters opponents Attack Power (primarily from their <<topic 'power'>> energy), this energy serves much like armor. Once depelted, you will take far more damage from hits. Even more effective when the <<topic 'Guard Action'>> is selected.</p> <<case 'power' >> <p>[<sss><<topic 'ENERGIES'>> > _topic</sss>]</p> <p>Power (<span class='statval STR'><<topic 'STR'>></span> x <span class='statval SPD'><<topic 'SPD'>></span>)</p> <p>Physical force/lift - this energy is the primary factor in determining how much you can currently lift, and how hard you hit. This is essentially a measure of the present state of your fast-twitch muscles.</p> <p>Flows into: <<topic 'fight'>>, <<topic 'regen'>>, <<topic 'train'>>, <<topic 'vigor'>></p> <p>Flows from: <<topic 'react'>>, <<topic 'metab'>>, <<topic 'skill'>>, <<topic 'tough'>></p> <p>Filled by: sleeping, eating healthy foods, raising <<topic 'Qi'>>.</p> <p>Drained by: taking damage, working out, or anything else that lowers <<topic 'Qi'>>.</p> <p>Increased by: anything that raises <<topic 'STR'>> and/or <<topic 'SPD'>>. Attacking a stronger opponent. Working out. Calisthenics. Weightlifting. Powerlifting. (not yet implemented, except for the car encounter)</p> <p>Combat role: Base Attack Power for Stiking Attacks, and Grip and Lever Strength for Grapples (not yet implemented), and increases running speed for both fleer and chaser.</p> <<case 'skill' >> <p>[<sss><<topic 'ENERGIES'>> > _topic</sss>]</p> <p>Skill (<span class='statval STR'><<topic 'STR'>></span> x <span class='statval INS'><<topic 'INS'>></span>)</p> <p>Precision/accuracy - how steady are your hands? Can you perform neuro-surgery, micro-sodering, or difuse a complex bomb without setting it off?</p> <p>This energy helps ...</p> <p>Flows into: <<topic 'power'>>, <<topic 'train'>>, <<topic 'force'>>, <<topic 'focus'>></p> <p>Flows from: <<topic 'tough'>>, <<topic 'vigor'>>, <<topic 'fight'>>, <<topic 'psych'>></p> <p>Filled by: sleeping, eating healthy foods, raising <<topic 'Qi'>>.</p> <p>Drained by: taking damage, working out, or anything else that lowers <<topic 'Qi'>>.</p> <p>Increased by: anything that raises <<topic 'STR'>> and/or <<topic 'INS'>>. Attacking. Working out. Calisthenics.</p> <p>Combat role: Offense/Crit-roll - significantly boosts damage (vs enemy <<topic 'guard'>> energy), especially against targets with no toughness (<<topic 'tough'>>) remaining; also used to help pursue fleeing opponents, allowing you to change direction quickly without losing momentum.</p> <<case 'aware' >> <p>[<sss><<topic 'ENERGIES'>> > _topic</sss>]</p> <p>Awareness/Enlightenment (<span class='statval PHY'><<topic 'PHY'>></span> x <span class='statval WSD'><<topic 'WSD'>></span>)</p> <p>Alertness to processes within the self and the environment - this energy is the primary focus of Yoga. It helps you to see the unseen, and to know the unknown.</p> <p>Flows into: <<topic 'psych'>>, <<topic 'guard'>>, <<topic 'vigor'>>, <<topic 'metab'>></p> <p>Flows from: <<topic 'train'>>, <<topic 'react'>>, <<topic 'focus'>>, <<topic 'vital'>></p> <p>Filled by: sleeping, eating healthy foods, raising <<topic 'Qi'>>.</p> <p>Drained by: taking damage, working out, or anything else that lowers <<topic 'Qi'>>.</p> <p>Increased by: anything that raises <<topic 'PHY'>> and/or <<topic 'WSD'>>. Fighting. Working out. Yoga.</p> <p>Combat role: Used to evade capture when fleeing, will also be used to detect traps and ambushes.</p> <<case 'vital' >> <p>[<sss><<topic 'ENERGIES'>> > _topic</sss>]</p> <p>Vitality (<span class='statval PHY'><<topic 'PHY'>></span> x <span class='statval END'><<topic 'END'>></span>)</p> <p>A general measure of health/resistance to disease and toxins, this is one of the fastest energies to recover during rest/sleep (the other being <<topic 'vigor'>>).</p> <p>Flows into: <<topic 'tough'>>, <<topic 'force'>>, <<topic 'aware'>>, <<topic 'metab'>></p> <p>Flows from: <<topic 'regen'>>, <<topic 'guard'>>, <<topic 'vigor'>>, <<topic 'focus'>></p> <p>Filled by: sleeping, eating healthy foods, raising <<topic 'Qi'>>.</p> <p>Drained by: taking damage, working out, or anything else that lowers <<topic 'Qi'>>.</p> <p>Increased by: anything that raises <<topic 'PHY'>> and/or <<topic 'END'>>. Fighting. Working out. Running/Jogging.</p> <p>Combat role: Strangely enough this does not yet have a role in combat, but it will relate to resisting the effects of poisons/toxins/drugs/diseases and other health-diminishing effects.</p> <<case 'metab' >> <p>[<sss><<topic 'ENERGIES'>> > _topic</sss>]</p> <p>Metabolism (<span class='statval PHY'><<topic 'PHY'>></span> x <span class='statval SPD'><<topic 'SPD'>></span>)</p> <p>This energy works alongside <<topic 'regen'>> to help energy recovery and fat burning, this is the only energy that goes down as you sleep.</p> <p>Flows into: <<topic 'power'>>, <<topic 'fight'>>, <<topic 'focus'>>, <<topic 'vigor'>></p> <p>Flows from: <<topic 'regen'>>, <<topic 'react'>>, <<topic 'vital'>>, <<topic 'aware'>></p> <p>Filled by: sleeping, eating anything with calories, drinking water, raising <<topic 'Qi'>>.</p> <p>Drained by: taking damage, working out, or anything else that lowers <<topic 'Qi'>>.</p> <p>Increased by: anything that raises <<topic 'PHY'>> and/or <<topic 'SPD'>>. Fighting. Working out. Running/Jogging.</p> <p>Combat role: None yet, though it does aid in energy and damage recovery.</p> <<case 'focus' >> <p>[<sss><<topic 'ENERGIES'>> > _topic</sss>]</p> <p>Focus (<span class='statval PHY'><<topic 'PHY'>></span> x <span class='statval INS'><<topic 'INS'>></span>)</p> <p>Attention to detail and Concentration</p> <p>Flows into: <<topic 'vital'>>, <<topic 'aware'>>, <<topic 'force'>>, <<topic 'psych'>></p> <p>Flows from: <<topic 'vigor'>>, <<topic 'metab'>>, <<topic 'fight'>>, <<topic 'skill'>></p> <p>Filled by: sleeping, eating healthy foods, raising <<topic 'Qi'>>.</p> <p>Drained by: taking damage, working out, or anything else that lowers <<topic 'Qi'>>.</p> <p>Increased by: anything that raises <<topic 'PHY'>> and/or <<topic 'INS'>>. Attacking. Working out. Yoga.</p> <p>Combat role: Used to activate some skills, like the Post-Combat <<topic 'beta: heal action'>>, also used to help keep track of and run down fleeing opponents.</p> <<case 'guard' >> <p>[<sss><<topic 'ENERGIES'>> > _topic</sss>]</p> <p>Guard (<span class='statval WSD'><<topic 'WSD'>></span> x <span class='statval END'><<topic 'END'>></span>)</p> <p>Active defense - a true fighter knows they cannot always evade strikes, but this energy helps make the hits far less severe.</p> <p>Flows into: <<topic 'vital'>>, <<topic 'tough'>>, <<topic 'psych'>>, <<topic 'react'>></p> <p>Flows from: <<topic 'force'>>, <<topic 'regen'>>, <<topic 'aware'>>, <<topic 'train'>></p> <p>Filled by: sleeping, eating healthy foods, raising <<topic 'Qi'>>.</p> <p>Drained by: taking damage, working out, or anything else that lowers <<topic 'Qi'>>.</p> <p>Increased by: anything that raises <<topic 'WSD'>> and/or <<topic 'END'>>. Being attacked. Working out.</p> <p>Combat role: Defense/Crit-Guard - prevents opponent from scoring critical hits (vs enemy <<topic 'skill'>> ENERGIES), and improves chance to counter-attack. Even more effective when the <<topic 'Guard Action'>> is selected.</p> <<case 'react' >> <p>[<sss><<topic 'ENERGIES'>> > _topic</sss>]</p> <p>Reaction (<span class='statval WSD'><<topic 'WSD'>></span> x <span class='statval SPD'><<topic 'SPD'>></span>)</p> <p>Defensive speed/reaction time - your ability to anticipate and avoid danger, puts you in a hypervigilant state where dodging/blocking is second nature.</p> <p>Flows into: <<topic 'metab'>>, <<topic 'power'>>, <<topic 'aware'>>, <<topic 'train'>></p> <p>Flows from: <<topic 'regen'>>, <<topic 'fight'>>, <<topic 'guard'>>, <<topic 'psych'>></p> <p>Filled by: sleeping, eating healthy foods, raising <<topic 'Qi'>>.</p> <p>Drained by: taking damage, working out, or anything else that lowers <<topic 'Qi'>>.</p> <p>Increased by: anything that raises <<topic 'WSD'>> and/or <<topic 'SPD'>>. Being attacked. Working out.</p> <p>Combat role: Defense/Evasion roll - improves chance to evade attacks (vs opponent's <<topic 'fight'>> energy), and escape pursuit, and possibly counter-attack. Even more effective when the <<topic 'Guard Action'>> is selected.</p> <<case 'psych' >> <p>[<sss><<topic 'ENERGIES'>> > _topic</sss>]</p> <p>Psionic Energy (<span class='statval WSD'><<topic 'WSD'>></span> x <span class='statval INS'><<topic 'INS'>></span>)</p> <p>The basis of most psionics and the ability to think beyond oneself. Due to the sheer amount of this energy used while dreaming, it may sometimes go down during sleep.</p> <p>Flows into: <<topic 'train'>>, <<topic 'react'>>, <<topic 'fight'>>, <<topic 'skill'>></p> <p>Flows from: <<topic 'aware'>>, <<topic 'guard'>>, <<topic 'force'>>, <<topic 'focus'>></p> <p>Filled by: sleeping, eating healthy foods, raising <<topic 'Qi'>>.</p> <p>Drained by: taking damage, working out, or anything else that lowers <<topic 'Qi'>>.</p> <p>Increased by: anything that raises <<topic 'WSD'>> and/or <<topic 'INS'>>. Fighting. Working out. Yoga. Sleeping/Dreaming.</p> <p>Combat role: Not yet implemented, will be a key factor in mental combat allong with willpower (<<topic 'force'>>).</p> <<case 'regen' >> <p>[<sss><<topic 'ENERGIES'>> > _topic</sss>]</p> <p>Regeneration (<span class='statval END'><<topic 'END'>></span> x <span class='statval SPD'><<topic 'SPD'>></span>)</p> <p>This energy helps the body recover from physical trauma, allowing you to recover from <<topic 'wounds'>>, <<topic 'muscle-damage'>>, and <<topic 'muscle-fatigue'>> faster.</p> <p>Flows into: <<topic 'react'>>, <<topic 'metab'>>, <<topic 'vital'>>, <<topic 'guard'>></p> <p>Flows from: <<topic 'fight'>>, <<topic 'power'>>, <<topic 'tough'>>, <<topic 'force'>></p> <p>Filled by: sleeping, eating healthy foods, raising <<topic 'Qi'>>.</p> <p>Drained by: taking damage, working out, or anything else that lowers <<topic 'Qi'>>.</p> <p>Increased by: anything that raises <<topic 'END'>> and/or <<topic 'SPD'>>. Taking damage. Working out. Running/Jogging.</p> <p>Combat role: improves recovery during the <<topic 'Guard Action'>> / <<topic 'Rest Action'>>.</p> <<case 'force' >> <p>[<sss><<topic 'ENERGIES'>> > _topic</sss>]</p> <p>Force of Will (<span class='statval END'><<topic 'END'>></span> x <span class='statval INS'><<topic 'INS'>></span>)</p> <p>Your willpower works in conjunction with your toughness (<<topic 'tough'>>) to overcome pain and stay the course. It is also the primary energy involved in powers like telekinesis, dominating, or resisting someone else's mind. (powers not yet available)</p> <p>Flows into: <<topic 'guard'>>, <<topic 'regen'>>, <<topic 'psych'>>, <<topic 'force'>></p> <p>Flows from: <<topic 'vital'>>, <<topic 'tough'>>, <<topic 'skill'>>, <<topic 'focus'>></p> <p>Filled by: sleeping, eating healthy foods, raising <<topic 'Qi'>>.</p> <p>Drained by: taking damage, working out, or anything else that lowers <<topic 'Qi'>>.</p> <p>Increased by: anything that raises <<topic 'END'>> and/or <<topic 'INS'>>. Fighting. Working out. Pushing yourself to the limit.</p> <p>Combat role: Does not presently have a role in combat, though it is the primary reason a lighter person can lift a much heavier one without falling over, since it can shift your center of gravity and help anchor you in place. (grappling/throws and telekinesis not yet available)</p> <<case 'fight' >> <p>[<sss><<topic 'ENERGIES'>> > _topic</sss>]</p> <p>Fight (<span class='statval SPD'><<topic 'SPD'>></span> x <span class='statval INS'><<topic 'INS'>></span>)</p> <p>Offensive speed/action time - essentailly your Will to Fight, puts you in a hypervigilant state where aiming is second-nature.</p> <p>Flows into: <<topic 'react'>>, <<topic 'regen'>>, <<topic 'focus'>>, <<topic 'skill'>></p> <p>Flows from: <<topic 'metab'>>, <<topic 'power'>>, <<topic 'force'>>, <<topic 'psych'>></p> <p>Filled by: sleeping, eating healthy foods, raising <<topic 'Qi'>>.</p> <p>Drained by: taking damage, working out, or anything else that lowers <<topic 'Qi'>>.</p> <p>Increased by: anything that raises <<topic 'SPD'>> and/or <<topic 'INS'>>. Fighting. Working out.</p> <p>Combat role: Offense/Aim roll - helps to anticipate enemy movements and compensate (vs enemy <<topic 'react'>> energy), allowing you to better hit the target and slightly improve damage. It also helps you run-down fleeing enemies.</p> <<case 'Qi' >> <p>[<sss><<topic 'ENERGIES'>> > _topic</sss>]</p> <p>Your life-force, the sum total of all your <<topic 'ENERGIES'>>. At zero you will fall unconscious, fall too far below that and you will die.</p> <<case 'METRICS' >> <p>[<sss>_topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<topic 'age'>> </p> <p><<topic 'height'>> </p> <p><<topic 'weight'>> </p> <p><<topic 'cup size'>> </p> <p><<topic 'chest size'>> </p> <p><<topic 'waist size'>> </p> <p><<topic 'hip size'>> </p> <p><<topic 'bicep size'>> </p> <p><<topic 'forearm size'>> </p> <p><<topic 'quad size'>> </p> <p><<topic 'calf size'>> </p> <p></p> <<case 'age' >> <p>[<sss><<topic 'METRICS'>> > _topic</sss>]</p> <p><<topic 'Biological Age'>></p> <p><<topic 'Temporal Age'>></p> <p><<topic 'lifespan'>></p> <p><<topic 'aging'>></p> <p>...<<topic ''>>...</p> <p></p> <<case 'biological age' >> <p>[<sss><<topic 'METRICS'>> > <<topic 'age'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p></p> <<case 'temporal age' >> <p>[<sss><<topic 'METRICS'>> > <<topic 'age'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p></p> <<case 'lifespan' >> <p>[<sss><<topic 'METRICS'>> > <<topic 'age'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p></p> <<case 'aging' >> <p>[<sss><<topic 'METRICS'>> > <<topic 'age'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p></p> <<case 'height' >> <p>[<sss><<topic 'METRICS'>> > _topic</sss>]</p> <p><<topic 'base height'>></p> <p></p> <<case 'base height' >> <p>[<sss><<topic 'METRICS'>> > <<topic 'height'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p></p> <<case 'weight' >> <p>[<sss><<topic 'METRICS'>> > _topic</sss>]</p> <p><<topic 'FOOD'>></p> <p></p> <<case 'base weight' >> <p>[<sss><<topic 'METRICS'>> > <<topic 'weight'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p></p> <<case 'WEIGHT' >> <p>[<sss><<topic 'METRICS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<topic 'bone mass'>> </p> <p><<topic 'fat mass'>> </p> <p><<topic 'muscle mass'>> </p> <p><<topic 'organ mass'>> </p> <<case 'bone mass' >> <p>[<sss><<topic 'METRICS'>> > <<topic 'WEIGHT'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'fat mass' >> <p>[<sss><<topic 'METRICS'>> > <<topic 'WEIGHT'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'muscle mass' >> <p>[<sss><<topic 'METRICS'>> > <<topic 'WEIGHT'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'organ mass' >> <p>[<sss><<topic 'METRICS'>> > <<topic 'WEIGHT'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'cup size' >> <p>[<sss><<topic 'METRICS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p></p> <<case 'chest size' >> <p>[<sss><<topic 'METRICS'>> > _topic</sss>]</p> <p><<topic 'cup size'>></p> <p></p> <<case 'waist size' >> <p>[<sss><<topic 'METRICS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p></p> <<case 'hip size' >> <p>[<sss><<topic 'METRICS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p></p> <<case 'bicep size' >> <p>[<sss><<topic 'METRICS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p></p> <<case 'forearm size' >> <p>[<sss><<topic 'METRICS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p></p> <<case 'quad size' >> <p>[<sss><<topic 'METRICS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p></p> <<case 'calf size' >> <p>[<sss><<topic 'METRICS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p></p> <<case 'KARMA' >> <p>[<sss>_topic</sss>]</p> <p>Karma is the energy forged by your trials and deeds... it may be used for personal growth, activating abilities, or reshaping the world around you. The higher your total karma, the larger the impact/effect you create, but the amount you can contain at any given time is limited by your own power-level.</p> <p>The twin forces of karma align to opposing sides... and you may hold equal amounts of each.</p> <p></p> <p>Working out to gain Karma, and spending it on things like stat boosts, keep your relative balance of Light and Dark, but other actions such as healing or draining may shift you entirely to one side.</p> <p>Some actions earn Karma, some spend it, but most have at least a small impact on your balance.</p> <p>Things that gain Karma of one polarity, reduce it opposite by half as much, while things that reduce one, raise its opposite by half. Still, there are things that will raise or lower your overall balance without shifting it.</p> <p></p> <p>At present, Karma may be used to do the following things: <ul class='topics'> <li>Raising <<topic 'STATS'>>, <<topic 'height'>>, <<topic 'weight'>>, <<topic 'cup size'>></li> <li>Performing the search action, as well as increasing the results/yields of said action.</li> <li>Activating the <<topic 'beta: drain/feed action'>>. (Note that <<topic 'beta: heal action'>> shifts Karma toward the Light, but does not require Karma to activate, since it instead uses your <<topic 'focus'>> and thus <<topic 'Qi'>>.)</li> <li>Shoplifting, without getting caught, also spends a small amount of karma.</li> </ul> </p> <p></p> <p><<topic 'light'>></p> <p><<topic 'dark'>></p> <<case 'light' >> <p>[<sss><<topic 'KARMA'>> > _topic</sss>]</p> <p><<topic 'KARMA'>> earned by giving of yourself to help others.</p> <<case 'dark' >> <p>[<sss><<topic 'KARMA'>> > _topic</sss>]</p> <p><<topic 'KARMA'>> earned by taking of others to help yourself.</p> <<case 'COMBAT' >> <p>[<sss>_topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<topic 'COMBAT ACTIONS'>> </p> <p><<topic 'POST COMBAT'>> </p> <p><<topic 'SLAVES'>> </p> <<case 'COMBAT ACTIONS' >> <p>[<sss><<topic 'COMBAT'>> > _topic</sss>]</p> <p><<topic 'Punch'>> - Average attack with good hit rate and low cost. Cannot be performed if your <<topic 'arms-condition'>> hits zero.</p> <p><<topic 'Kick'>> - Strong attack with high crit rate, moderate miss chance, and high cost. Cannot be performed if your <<topic 'legs-condition'>> hits zero.</p> <p><<topic 'Slap'>> - Light attack with light armor-break, excellent hit rate, extremely low crit rate, and low cost. Cannot be performed if your <<topic 'arms-condition'>> hits zero.</p> <p><<topic 'Headbutt'>> - Armor break attack with very high crit rate, high miss chance, and moderate cost. Cannot be performed if your <<topic 'core-condition'>> hits zero.</p> <p><<topic 'Guard Action'>> - Defensive rest, significantly improves chance to block, prevent incoming crits, reduce damage, and counter-attack; also give you a 3 second active recovery to <<topic 'Qi'>> (like a micro-sleep). Cannot be performed if your <<topic 'arms-condition'>> hits zero.</p> <p><<topic 'Rest Action'>> - Basic rest, replaces <<topic 'Guard Action'>> when your <<topic 'arms-condition'>> hits zero or your opponent is stunned, gives a 3 second active recovery to <<topic 'Qi'>> (like a micro-sleep). Also stimulates qi-flow, which helps to rebalance your Qi <<topic 'ENERGIES'>> and replenish energies such as <<topic 'vigor'>>, <<topic 'tough'>>, and <<topic 'focus'>>, which may have been depleted during the engagement. (If you haven't enabled the display of the 15 energies in the settings menu, then keep an eye instead for how fast your Qi falls and take short rests accordingly.)</p> <p><<topic 'Fleeing'>> - An all-out attempt to escape your opponent that will likely leave both of you out of breath, works best against slower or already fatigued opponents. Cannot be performed if your <<topic 'legs-condition'>> or <<topic 'core-condition'>> hits zero. Sometimes you can use a failed attempt at fleeing followed by continual guarding to take the sting out of stronger opponents attacks, but this is a very dangerous maneuver as running opens you up to potentially critical attacks that in extreme cases can be fatal. (if you fail to escape, your opponent gets a free attack after they catch up... however, both of you have already spent a large portion of your <<topic 'power'>>, so their hits will likely be much softer for a few rounds until their <<topic 'Qi'>> rebalances.)</p> <<case 'Punch' >> <p>[<sss><<topic 'COMBAT'>> > <<topic 'COMBAT ACTIONS'>> > STRIKING > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p>Base Hit Rate: 84% </p> <p>Base Crit Rate: 15% </p> <p>Base dmg Rate: 69% </p> <p>Base tuf Rate: 34% </p> <p>Base stam cost: 1.60 </p> <<case 'Kick' >> <p>[<sss><<topic 'COMBAT'>> > <<topic 'COMBAT ACTIONS'>> > STRIKING > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p>Base Hit Rate: 66% </p> <p>Base Crit Rate: 33% </p> <p>Base dmg Rate: 142% </p> <p>Base tuf Rate: 69% </p> <p>Base stam cost: 3.40 </p> <<case 'Slap' >> <p>[<sss><<topic 'COMBAT'>> > <<topic 'COMBAT ACTIONS'>> > STRIKING > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p>Base Hit Rate: 98% </p> <p>Base Crit Rate: 01% </p> <p>Base dmg Rate: 34% </p> <p>Base tuf Rate: 116% </p> <p>Base stam cost: 1.34 </p> <<case 'Headbutt' >> <p>[<sss><<topic 'COMBAT'>> > <<topic 'COMBAT ACTIONS'>> > STRIKING > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p>Base Hit Rate: 34% </p> <p>Base Crit Rate: 65% </p> <p>Base dmg Rate: 16% </p> <p>Base tuf Rate: 142% </p> <p>Base stam cost: 2.10 </p> <<case 'Guard Action' >> <p>[<sss><<topic 'COMBAT'>> > <<topic 'COMBAT ACTIONS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'Rest Action' >> <p>[<sss><<topic 'COMBAT'>> > <<topic 'COMBAT ACTIONS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'Fleeing' >> <p>[<sss><<topic 'COMBAT'>> > <<topic 'COMBAT ACTIONS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'POST COMBAT' >> <p>[<sss><<topic 'COMBAT'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'beta: heal action'>> <p>[<sss><<topic 'COMBAT'>> > <<topic 'POST COMBAT'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'beta: drain/feed action'>> <p>[<sss><<topic 'COMBAT'>> > <<topic 'POST COMBAT'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'taking slaves' >> <p>[<sss><<topic 'COMBAT'>> > <<topic 'POST COMBAT'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'SLAVES' >> <p>[<sss><<topic 'COMBAT'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'GENERAL' >> <p>[<sss>_topic</sss>]</p> <p>...<<topic 'low-average'>>...</p> <<case 'low-average' >> <p>The average, of the average and minimum values of a set. (Calculated by adding the average value and minimum value for a set, then dividing by two.)</p> <<case 'BODY' >> <p>[<sss>_topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<topic 'body-fat'>> </p> <p><<topic 'muscle'>> </p> <p><<topic 'organs'>> </p> <p><<topic 'limbs'>> </p> <p><<topic 'wounds'>> </p> <p><<topic 'muscle-condition'>> </p> <p><<topic 'muscle-damage'>> </p> <p><<topic 'muscle-fatigue'>> </p> <p><<topic 'muscle-tone'>> </p> <p><<topic 'MUSCLES'>> </p> <<case 'body-fat' >> <p>[<sss><<topic 'BODY'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'muscle' >> <p>[<sss><<topic 'BODY'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'organs' >> <p>[<sss><<topic 'BODY'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'limbs' >> <p>[<sss><<topic 'BODY'>> > _topic</sss>]</p> <p>Limb condition is calculated as the <<topic 'low-average'>> of the applicable body-zones.</p> <p>...<<topic 'arms-condition'>>...</p> <p>...<<topic 'legs-condition'>>...</p> <p>...<<topic 'core-condition'>>...</p> <<case 'arms-condition' >> <p>[<sss><<topic 'BODY'>> > <<topic 'limbs'>> > _topic</sss>]</p> <p>The <<topic 'low-average'>> of the following regions: <<topic 'Delts'>>, <<topic 'Triceps'>>, <<topic 'Biceps'>>, <<topic 'Forearms'>>, <<topic 'Grip'>>, <<topic 'Lats'>>, <<topic 'Traps'>>, <<topic 'Pecs'>>.</p> <<case 'legs-condition' >> <p>[<sss><<topic 'BODY'>> > <<topic 'limbs'>> > _topic</sss>]</p> <p>The <<topic 'low-average'>> of the following regions: <<topic 'Glutes'>>, <<topic 'Hips'>>, <<topic 'Quads'>>, <<topic 'Hamstrings'>>, <<topic 'Calves'>>.</p> <<case 'core-condition' >> <p>[<sss><<topic 'BODY'>> > <<topic 'limbs'>> > _topic</sss>]</p> <p>The <<topic 'low-average'>> of the following regions: <<topic 'Abs'>>, <<topic 'Lower Back'>>, <<topic 'Cardio'>>, <<topic 'Kegel'>>.</p> <<case 'wounds' >> <p>[<sss><<topic 'BODY'>> > _topic</sss>]</p> <p><<topic 'regen'>></p> <<case 'muscle-condition'>> <p>[<sss><<topic 'BODY'>> > _topic</sss>]</p> <p><<topic 'regen'>></p> <<case 'muscle-damage' >> <p>[<sss><<topic 'BODY'>> > _topic</sss>]</p> <p><<topic 'regen'>></p> <<case 'muscle-fatigue' >> <p>[<sss><<topic 'BODY'>> > _topic</sss>]</p> <p><<topic 'regen'>></p> <<case 'muscle-tone' >> <p>[<sss><<topic 'BODY'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'MUSCLES' >> <p>[<sss><<topic 'BODY'>> > _topic</sss>]</p> <p> <ul class='topics'> <li><<topic 'Calves'>> </li> <li><<topic 'Quads'>> </li> <li><<topic 'Hamstrings'>> </li> <li><<topic 'Glutes'>> </li> <li><<topic 'Hips'>> </li> <li><<topic 'Lower Back'>> </li> <li><<topic 'Lats'>> </li> <li><<topic 'Traps'>> </li> <li><<topic 'Abs'>> </li> <li><<topic 'Pecs'>> </li> <li><<topic 'Delts'>> </li> <li><<topic 'Triceps'>> </li> <li><<topic 'Biceps'>> </li> <li><<topic 'Forearms'>> </li> <li><<topic 'Grip'>> </li> <li><<topic 'Cardio'>> </li> <li><<topic 'Kegel'>> </li> </ul> </p> <<case 'Calves' >> <p>[<sss><<topic 'BODY'>> > <<topic 'MUSCLES'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listWorkouts_forMuscle('Calves');>></p> <<case 'Quads' 'Quadriceps' >> <p>[<sss><<topic 'BODY'>> > <<topic 'MUSCLES'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listWorkouts_forMuscle('Quads');>></p> <<case 'Hamstrings' 'Hams' >> <p>[<sss><<topic 'BODY'>> > <<topic 'MUSCLES'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listWorkouts_forMuscle('Hams');>></p> <<case 'Glutes' 'Gluteus' >> <p>[<sss><<topic 'BODY'>> > <<topic 'MUSCLES'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listWorkouts_forMuscle('Glutes');>></p> <<case 'Hips' 'Hipflexors' >> <p>[<sss><<topic 'BODY'>> > <<topic 'MUSCLES'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listWorkouts_forMuscle('Hips');>></p> <<case 'Lower Back' 'LoBack' >> <p>[<sss><<topic 'BODY'>> > <<topic 'MUSCLES'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listWorkouts_forMuscle('LoBack');>></p> <<case 'Lats' 'Latissimus' >> <p>[<sss><<topic 'BODY'>> > <<topic 'MUSCLES'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listWorkouts_forMuscle('Lats');>></p> <<case 'Traps' 'Trapezius' >> <p>[<sss><<topic 'BODY'>> > <<topic 'MUSCLES'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listWorkouts_forMuscle('Traps');>></p> <<case 'Abs' 'Abdominals' >> <p>[<sss><<topic 'BODY'>> > <<topic 'MUSCLES'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listWorkouts_forMuscle('Abs');>></p> <<case 'Pecs' 'Pectorals' >> <p>[<sss><<topic 'BODY'>> > <<topic 'MUSCLES'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listWorkouts_forMuscle('Pecs');>></p> <<case 'Delts' 'Deltoids' >> <p>[<sss><<topic 'BODY'>> > <<topic 'MUSCLES'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listWorkouts_forMuscle('Delts');>></p> <<case 'Triceps' 'LeftTri' 'RightTri' 'Tricep (L)' 'Tricep (R)' >> <p>[<sss><<topic 'BODY'>> > <<topic 'MUSCLES'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listWorkouts_forMuscle('LeftTri');>></p> <<case 'Biceps' 'LeftBi' 'RightBi' 'Bicep (L)' 'Bicep (R)' >> <p>[<sss><<topic 'BODY'>> > <<topic 'MUSCLES'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listWorkouts_forMuscle('LeftBi');>></p> <<case 'Forearms' 'LeftFore' 'RightFore' 'Forearm (L)' 'Forearm (R)' >> <p>[<sss><<topic 'BODY'>> > <<topic 'MUSCLES'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listWorkouts_forMuscle('LeftFore');>></p> <<case 'Grip' 'LeftGrip' 'RightGrip' 'Grip (L)' 'Grip (R)' >> <p>[<sss><<topic 'BODY'>> > <<topic 'MUSCLES'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listWorkouts_forMuscle('LeftGrip');>></p> <<case 'Cardio' >> <p>[<sss><<topic 'BODY'>> > <<topic 'MUSCLES'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listWorkouts_forMuscle('Cardio');>></p> <<case 'Kegel' >> <p>[<sss><<topic 'BODY'>> > <<topic 'MUSCLES'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listWorkouts_forMuscle('Kegel');>></p> <<case 'GYM' >> <p>[<sss>_topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<topic 'GYM NPCS'>> </p> <p>...<<topic ''>>...</p> <p><<topic 'WORKOUT LOADS'>> </p> <p><<topic 'BALANCED ROUTINES'>> </p> <p><<topic 'CLASSES'>> </p> <p><<topic 'CARDIO MACHINES'>> </p> <p><<topic 'PT AREA'>> </p> <p><<topic 'CROSSFIT'>> </p> <p><<topic 'LIFT STATIONS'>> </p> <<case 'WORKOUT LOADS'>> <p>[<sss><<topic 'GYM'>> > _topic</sss>]</p> <p><<topic 'GO FOR MAX LIFT'>> - gives a bonus to the <span class='statval STR'><<topic 'STR'>></span> stat.</p> <p><<topic 'SLOW REPS/MAX FLEX'>> - gives a bonus to the <span class='statval PHY'><<topic 'PHY'>></span> stat.</p> <p><<topic 'WARM UP/LIGHT TONE'>> - gives a bonus to the <span class='statval WSD'><<topic 'WSD'>></span> stat.</p> <p><<topic 'BURNOUT/MAX REPS'>> - gives a bonus to the <span class='statval END'><<topic 'END'>></span> stat.</p> <p><<topic 'WORK HEAVY/FAST'>> - gives a bonus to the <span class='statval SPD'><<topic 'SPD'>></span> stat.</p> <p><<topic 'PROPER TECHNIQUE'>> - gives a bonus to the <span class='statval INS'><<topic 'INS'>></span> stat.</p> <<case 'GO FOR MAX LIFT'>> <p>[<sss><<topic 'GYM'>> > <<topic 'WORKOUT LOADS'>> > _topic</sss>]</p> <p>A dangerous, but often desired test of strength, where you push your body to the brink of failure, and either get an extra boost of <<topic 'STR'>>, or possibly a trip to the emergency room if you fail. (note, while injuries are not yet implemented, it is still possible to fail this lift and get only a partial stat-gain, with higher than normal muscle-damage applied) Uses a load that is roughly 100% of your estimated single-lift max for that exercise. You should be able to compete about 0-2 reps at that load.</p> <<case 'SLOW REPS/MAX FLEX'>> <p>[<sss><<topic 'GYM'>> > <<topic 'WORKOUT LOADS'>> > _topic</sss>]</p> <p>A slow, controlled workout meant to maximize muscles and take your peaks to new heights, doesn't hurt that it also gives a bonus to <<topic 'PHY'>>. Uses a load that is roughly 65% of your estimated single-lift max for that exercise. You should be able to compete about 6-12 reps at that load and pace.</p> <<case 'WARM UP/LIGHT TONE'>> <p>[<sss><<topic 'GYM'>> > <<topic 'WORKOUT LOADS'>> > _topic</sss>]</p> <p>A simple and safe workout that leaves you feeling refreshed and ready for more, and gives a nice little boost to <<topic 'WSD'>>. Uses a load that is roughly 25% of your estimated single-lift max for that exercise. You should be able to compete over 100 reps at that load, but you're supposed to stop at 10. (note: that last part hasn't been implemented yet, so this load will use the same amount of stamina as the others)</p> <<case 'BURNOUT/MAX REPS'>> <p>[<sss><<topic 'GYM'>> > <<topic 'WORKOUT LOADS'>> > _topic</sss>]</p> <p>A grueling workout with drop-sets until you can barely move... gives a bonus to <<topic 'END'>>. Uses a load that is roughly 50% of your estimated single-lift max for that exercise. You should be able to compete over 30 reps at that load.</p> <<case 'WORK HEAVY/FAST'>> <p>[<sss><<topic 'GYM'>> > <<topic 'WORKOUT LOADS'>> > _topic</sss>]</p> <p>A short, but high intensity workout that really pushes your fast-twitch muscles and gives a bonus to <<topic 'SPD'>>. Uses a load that is roughly 85% of your estimated single-lift max for that exercise. You should be able to compete about 4-6 reps at that load.</p> <<case 'PROPER TECHNIQUE'>> <p>[<sss><<topic 'GYM'>> > <<topic 'WORKOUT LOADS'>> > _topic</sss>]</p> <p>A carefully executed, but still challenging lift focusing more on form than weight; one that helps further hone your <<topic 'INS'>>. Uses a load that is roughly 75% of your estimated single-lift max for that exercise. You should be able to compete about 8-20 reps at that load.</p> <<case 'BALANCED ROUTINES'>> <p>[<sss><<topic 'GYM'>> > _topic</sss>]</p> <p>area coming soon (requires multi-workout sets be added to the gym)</p> <<case 'CLASSES' >> <p>[<sss><<topic 'GYM'>> > _topic</sss>]</p> <p>area coming soon (requires timed workouts be added to the gym, and the passive-time/scheduling system)</p> <<case 'CARDIO MACHINES'>> <p>[<sss><<topic 'GYM'>> > _topic</sss>]</p> <p>area coming soon (requires timed workouts be added to the gym)</p> <<case 'PT AREA' >> <p>[<sss><<topic 'GYM'>> > _topic</sss>]</p> <p>The Physical Training/Calisthenics Area consists of bars, mats, and a large open area for body-weight workouts. If you need extra challenge, there are also weight-belts with plates you can hook on.</p> <p> <ul class='topics'> <li><<topic 'Back Extension'>> </li> <li><<topic 'Crunch'>> </li> <li><<topic 'Dips'>> </li> <li><<topic 'Leg Raise'>> </li> <li><<topic 'Lunge'>> </li> <li><<topic 'Pull-up'>> </li> <li><<topic 'Push-up'>> </li> <li><<topic ''>> </li> </ul> </p> <<case 'Back Extension' >> <p>[<sss><<topic 'GYM'>> > <<topic 'PT AREA'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listMuscles_forWorkout('Back Extension');>></p> <<case 'Crunch' >> <p>[<sss><<topic 'GYM'>> > <<topic 'PT AREA'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listMuscles_forWorkout('Crunch');>></p> <<case 'Dips' >> <p>[<sss><<topic 'GYM'>> > <<topic 'PT AREA'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listMuscles_forWorkout('Dips');>></p> <<case 'Leg Raise' >> <p>[<sss><<topic 'GYM'>> > <<topic 'PT AREA'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listMuscles_forWorkout('Leg Raise');>></p> <<case 'Lunge' >> <p>[<sss><<topic 'GYM'>> > <<topic 'PT AREA'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listMuscles_forWorkout('Lunge');>></p> <<case 'Pull-up' >> <p>[<sss><<topic 'GYM'>> > <<topic 'PT AREA'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listMuscles_forWorkout('Pull-up');>></p> <<case 'Push-up' >> <p>[<sss><<topic 'GYM'>> > <<topic 'PT AREA'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listMuscles_forWorkout('Push-up');>></p> <<case 'CROSSFIT' >> <p>[<sss><<topic 'GYM'>> > _topic</sss>]</p> <p>area coming soon (requires timed workouts be added to the gym)</p> <<case 'LIFT STATIONS' >> <p>[<sss><<topic 'GYM'>> > _topic</sss>]</p> <p>The Lifting area of the gym consists of various benches, freeweights, and machines designed around specific workouts. (the current gym implementation seems to use a cable-resistance system with unlimited capacity)</p> <p> <ul class='topics'> <li><<topic 'Bench Press'>> </li> <li><<topic 'Bent-over Row'>> </li> <li><<topic 'Biceps Curl'>> </li> <li><<topic 'Calf Raise'>> </li> <li><<topic 'Chest Fly'>> </li> <li><<topic 'Deadlift'>> </li> <li><<topic 'Lateral Raise'>> </li> <li><<topic 'Leg Curl'>> </li> <li><<topic 'Leg Extension'>> </li> <li><<topic 'Leg Press'>> </li> <li><<topic 'Military Press'>> </li> <li><<topic 'Pull-down'>> </li> <li><<topic 'Shoulder Shrug'>> </li> <li><<topic 'Squat'>> </li> <li><<topic 'Triceps Extension'>> </li> <li><<topic 'Upright Row'>> </li> <li><<topic 'Wrist Curl'>> </li> </ul> </p> <<case 'Bench Press' >> <p>[<sss><<topic 'GYM'>> > <<topic 'LIFT STATIONS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listMuscles_forWorkout('Bench Press');>></p> <<case 'Bent-over Row' >> <p>[<sss><<topic 'GYM'>> > <<topic 'LIFT STATIONS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listMuscles_forWorkout('Bent-over Row');>></p> <<case 'Biceps Curl' >> <p>[<sss><<topic 'GYM'>> > <<topic 'LIFT STATIONS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listMuscles_forWorkout('Biceps Curl');>></p> <<case 'Calf Raise' >> <p>[<sss><<topic 'GYM'>> > <<topic 'LIFT STATIONS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listMuscles_forWorkout('Calf Raise');>></p> <<case 'Chest Fly' >> <p>[<sss><<topic 'GYM'>> > <<topic 'LIFT STATIONS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listMuscles_forWorkout('Chest Fly');>></p> <<case 'Deadlift' >> <p>[<sss><<topic 'GYM'>> > <<topic 'LIFT STATIONS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listMuscles_forWorkout('Deadlift');>></p> <<case 'Lateral Raise' >> <p>[<sss><<topic 'GYM'>> > <<topic 'LIFT STATIONS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listMuscles_forWorkout('Lateral Raise');>></p> <<case 'Leg Curl' >> <p>[<sss><<topic 'GYM'>> > <<topic 'LIFT STATIONS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listMuscles_forWorkout('Leg Curl');>></p> <<case 'Leg Extension' >> <p>[<sss><<topic 'GYM'>> > <<topic 'LIFT STATIONS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listMuscles_forWorkout('Leg Extension');>></p> <<case 'Leg Press' >> <p>[<sss><<topic 'GYM'>> > <<topic 'LIFT STATIONS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listMuscles_forWorkout('Leg Press');>></p> <<case 'Military Press' >> <p>[<sss><<topic 'GYM'>> > <<topic 'LIFT STATIONS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listMuscles_forWorkout('Military Press');>></p> <<case 'Pull-down' >> <p>[<sss><<topic 'GYM'>> > <<topic 'LIFT STATIONS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listMuscles_forWorkout('Pull-down');>></p> <<case 'Shoulder Shrug' >> <p>[<sss><<topic 'GYM'>> > <<topic 'LIFT STATIONS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listMuscles_forWorkout('Shoulder Shrug');>></p> <<case 'Squat' >> <p>[<sss><<topic 'GYM'>> > <<topic 'LIFT STATIONS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listMuscles_forWorkout('Squat');>></p> <<case 'Triceps Extension'>> <p>[<sss><<topic 'GYM'>> > <<topic 'LIFT STATIONS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listMuscles_forWorkout('Triceps Extension');>></p> <<case 'Upright Row' >> <p>[<sss><<topic 'GYM'>> > <<topic 'LIFT STATIONS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listMuscles_forWorkout('Upright Row');>></p> <<case 'Wrist Curl' >> <p>[<sss><<topic 'GYM'>> > <<topic 'LIFT STATIONS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<print setup.ALIAS.gym_listMuscles_forWorkout('Wrist Curl');>></p> <<case 'WORKOUTS' >> <p>[<sss>_topic</sss>]</p> <p>Basic Workouts</p> <<case 'walking' >> <p>[<sss>BASIC <<topic 'WORKOUTS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'jogging' >> <p>[<sss>BASIC <<topic 'WORKOUTS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'running' >> <p>[<sss>BASIC <<topic 'WORKOUTS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'calisthenics' >> <p>[<sss>BASIC <<topic 'WORKOUTS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'aerobics' >> <p>[<sss>BASIC <<topic 'WORKOUTS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'yoga' >> <p>[<sss>BASIC <<topic 'WORKOUTS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'weightlifting' >> <p>[<sss>BASIC <<topic 'WORKOUTS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'crossfit' >> <p>[<sss>BASIC <<topic 'WORKOUTS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'powerlifting' >> <p>[<sss>BASIC <<topic>> > _topic</sss>]</p> <p>not yet implemented, though car-lifting/throwing should count (it currently uses the <<topic 'Military Press'>> lift under the basic <<topic 'weightlifting'>> workout matrix).</p> <<case 'ITEMS' >> <p>[<sss>_topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<topic 'FOOD'>></p> <p><<topic 'CLOTHING'>></p> <p><<topic 'shards'>></p> <<case 'FOOD' >> <p>[<sss><<topic 'ITEMS'>> > _topic</sss>]</p> <p>...<<topic 'calories'>>...</p> <p>...<<topic 'protein'>>...</p> <p>...<<topic 'sugar'>>...</p> <p>...<<topic ''>>...</p> <p>...<<topic ''>>...</p> <p>...<<topic ''>>...</p> <<case 'calories' >> <p>[<sss><<topic 'ITEMS'>> > <<topic 'FOOD'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'protein' >> <p>[<sss><<topic 'ITEMS'>> > <<topic 'FOOD'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'sugar' >> <p>[<sss><<topic 'ITEMS'>> > <<topic 'FOOD'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'water' >> <p>[<sss><<topic 'ITEMS'>> > <<topic 'FOOD'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'produce' >> <p>[<sss><<topic 'ITEMS'>> > <<topic 'FOOD'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'junk food' >> <p>[<sss><<topic 'ITEMS'>> > <<topic 'FOOD'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'meat' >> <p>[<sss><<topic 'ITEMS'>> > <<topic 'FOOD'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'CLOTHING' >> <p>[<sss><<topic 'ITEMS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'shards' >> <p>[<sss><<topic 'ITEMS'>> > _topic</sss>]</p> <p>mysterious crystal fragments, whatever could they be for?</p> <<case 'EXPLORATION' >> <p>[<sss>_topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'looking for change' >> <p>[<sss><<topic 'EXPLORATION'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'NPCS' >> <p>[<sss>_topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<topic 'fighting'>> </p> <p><<topic 'flirting'>> </p> <p><<topic 'talking'>> </p> <p><<topic 'RANDOM NPCS'>> </p> <p><<topic 'NPCS BY LOCATION'>> </p> <<case 'fighting' >> <p>[<sss><<topic 'NPCS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'flirting' >> <p>[<sss><<topic 'NPCS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'talking' >> <p>[<sss><<topic 'NPCS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'RANDOM NPCS' >> <p>[<sss><<topic 'NPCS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'NPCS BY LOCATION' >> <p>[<sss><<topic 'NPCS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p><<topic 'GYM NPCS'>> </p> <<case 'GYM NPCS' >> <p>[<sss><<topic 'NPCS'>> ><<topic 'NPCS BY LOCATION'>>/<<topic 'GYM'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p>...<<topic 'Katie, the desk clerk'>> </p> <<case 'Katie, the desk clerk' >> <p>[<sss><<topic 'NPCS'>> ><<topic 'NPCS BY LOCATION'>>/<<topic 'GYM'>> > <<topic 'GYM NPCS'>> > _topic</sss>]</p> <p>...<<topic ''>>...</p> <p>Katie, the desk <<print setup.ALIAS.abFlicker('clerk, ', 'cleric,'); >> is the <<print setup.ALIAS.abFlicker('cute', ' cat '); >> girl at the gym counter/front-desk with the box of <<print setup.ALIAS.abFlicker('necco', ' neko '); >> wafers.</p> <<print setup.ALIAS.run_abFlicker();>> <<case 'POWERS' >> <p>[<sss>_topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'SKILLS' >> <p>[<sss>_topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'TRAVEL' >> <p>[<sss>_topic</sss>]</p> <p>...<<topic ''>>...</p> <<case 'SEX' >> <p>[<sss>_topic</sss>]</p> <p>TODO (not in game yet)</p> <<default>> <p>[<sss>???</sss>]</p> <p>unknown topic, <u>_topic</u></p> <</switch>> <p></p> <p></p> <p></p> <p class='keypress' key='[ESC]'><<link 'RETURN'>><<unset _topic;>><<run setup.ALIAS.menuShow('guide');>><</link>></p> <</if>>
<<set setup.DIALOG={ 'karma_spend' : function(PARAMS) { setup.ALIAS.default_params(PARAMS, { 'dir' : 'raise', 'amt' : 1, 'cost' : 0, 'type' : 'Karma', 'label' : '?', 'hint' : '', 'CHAR' : null, 'callback' : null, 'ARGS' : null, }); return " <p>Spend "+ PARAMS.cost +" "+ PARAMS.type +" to "+ PARAMS.dir +" base "+ PARAMS.label +" by "+ PARAMS.amt +"? "+ PARAMS.hint +"</p> <b> <span class='keypress' key='[ENTER]'> <<link 'YES'>> <<run if(PARAMS.callback && setup.ALIAS[PARAMS.callback]) { setup.ALIAS[PARAMS.callback](...ARGS); } setup.ALIAS.payCost({PARAMS.type: PARAMS.cost}, CHAR); setup.ALIAS.do_status_update(CHAR); /* replace this with a stat-refresh */ if('GO HOME'==State.passage) { Engine.play(State.passage, true); } setup.ALIAS.dialog_hide(); >> <</link>> </span> / <span class='keypress' key='[ESC]'><<link 'NO'>><<run setup.ALIAS.dialog_hide();>><</link>></span> </b> "; }, /* END setup.DIALOG */ }>>
<<set setup.CHARS['Susan Marien'] = { '_':{ 'build_lv':'public', }, 'ABOUT':{ 'who_is':'high school athlete', }, 'BODY':{ 'Calves' :{ 'train': 9.0, 'damage':2.1, }, 'Quads' :{ 'train':11.7, 'damage':2.2, }, 'Hams' :{ 'train': 8.2, 'damage':2.4, }, 'Glutes' :{ 'train': 9.9, 'damage':2.7, }, 'Hips' :{ 'train': 7.1, 'damage':2.0, }, 'LoBack' :{ 'train': 6.8, 'damage':2.1, }, 'Lats' :{ 'train': 7.6, 'damage':1.7, }, 'Traps' :{ 'train': 9.6, 'damage':2.2, }, 'Abs' :{ 'train':11.2, 'damage':2.8, }, 'Pecs' :{ 'train':13.4, 'damage':2.9, }, 'Delts' :{ 'train':13.4, 'damage':3.6, }, 'LeftTri' :{ 'train': 9.1, 'damage':2.4, }, 'RightTri' :{ 'train': 9.1, 'damage':2.4, }, 'LeftBi' :{ 'train':11.2, 'damage':3.1, }, 'RightBi' :{ 'train':11.2, 'damage':3.1, }, 'LeftFore' :{ 'train': 9.7, 'damage':3.6, }, 'RightFore' :{ 'train': 9.7, 'damage':3.6, }, 'LeftGrip' :{ 'train':11.0, 'damage':2.9, }, 'RightGrip' :{ 'train':11.0, 'damage':2.9, }, 'Cardio' :{ 'train':12.8, 'damage':2.1, }, 'Kegel' :{ 'train':13.6, 'damage':4.7, }, 'Brain' :{ 'train': 9.3, 'damage':3.1, }, }, 'DEVICES':{}, 'ENEMIES':{}, 'EQUIP':{ /* SLOT:ID */ 'panties' :"D01_A13_I03", 'pants' :"D01_A09_I02", 'shirt' :"D01_A10_I02", 'socks' :"D01_A13_I01", 'undershirt':"D01_A02_I01", }, 'EXSLAVES':{}, 'FRIENDS':{}, 'JUNK':{}, 'LIMBS':{ 'ARML':{ 'total': 8.0, 'min': 8.0, 'parts': 8.0, 'avg':1.0, 'pct':1.0, }, 'ARMR':{ 'total': 8.0, 'min': 8.0, 'parts': 8.0, 'avg':1.0, 'pct':1.0, }, 'ARMS':{ 'total':12.0, 'min':12.0, 'parts':12.0, 'avg':1.0, 'pct':1.0, }, 'CORE':{ 'total': 5.0, 'min': 5.0, 'parts': 5.0, 'avg':1.0, 'pct':1.0, }, 'LEGL':{ 'total': 6.0, 'min': 6.0, 'parts': 6.0, 'avg':1.0, 'pct':1.0, }, 'LEGR':{ 'total': 6.0, 'min': 6.0, 'parts': 6.0, 'avg':1.0, 'pct':1.0, }, 'LEGS':{ 'total': 6.0, 'min': 6.0, 'parts': 6.0, 'avg':1.0, 'pct':1.0, }, 'SEXX':{ 'total': 7.0, 'min': 7.0, 'parts': 7.0, 'avg':1.0, 'pct':1.0, }, }, 'LOVERS':{}, 'M':{ 'WEIGHT' :{ 'BODY' :{ 'bone' : 9.00, 'fat' : 64.00, 'muscle' : - 44.00, 'organs' : 28.00, }, 'CACHE' :{}, 'CALC' :{ 'scale' : 0.98, 'fatPct' : 0.25, 'musclePct' : 0.30, 'tonePct' : 0.20, 'bmi' : 20.00, }, 'SCALED' :{ 'body' : 169.0, }, 'updated' : Date.now(), }, }, 'MATRIX':{ /* SECONDARY STATS/ENERGY - current values (renewable resources) */ 'vigor' : 130.0, /* STR+PHY - [P] stamina */ 'train' : 80.0, /* STR+WSD - [H] discipline/training */ 'tough' : 34.0, /* STR+END - [P] resistance to damage */ 'power' : 160.0, /* STR+SPD - [P] physical force/lift */ 'skill' : 71.0, /* STR+INS - [H] precision/accuracy */ 'aware' : 44.0, /* PHY+WSD - [H] alertness to environment */ 'vital' : 56.0, /* PHY+END - [P] health */ 'metab' : 47.0, /* PHY+SPD - [P] metabolism */ 'focus' : 28.0, /* PHY+INS - [H] attention to detail */ 'guard' : 63.0, /* WSD+END - [H] active defense */ 'react' : 31.0, /* WSD+SPD - [H] defensive speed/reaction time */ 'psych' : 23.0, /* WSD+INS - [M] psionic energy */ 'regen' : 74.0, /* END+SPD - [P] regeneration/healing */ 'force' : 52.0, /* END+INS - [H] force of will */ 'fight' : 66.0, /* SPD+INS - [H] offensive speed/action time */ /* RESOURCES - (non-stat/non-renewable) */ 'light' : 60.00, /* ? unit */ 'dark' : 60.00, /* ? unit */ 'kcal' : 1463.00, /* food calories consumed, total */ 'protein' : 327.00, /* grams consumed, nutrition */ 'sugar' : 64.00, /* grams consumed, empty calories */ 'money' : 27.00, /* */ 'petro' : 0.000001, /* gallons, remaining */ }, 'METRICS':{ 'age' : 16.0, /* */ 'base_ht' : 72.0, /* height, inches */ 'ht' : 71.0, /* height, inches */ 'bicep' : 13.0, /* inches; */ 'quads' : 23.0, /* inches; */ 'chest' : 31.0, /* */ 'bust' : 1, /* base cup size */ 'cup' : "C", /* */ 'waist' : 24.0, /* */ 'hips' : 34.0, /* */ 'BMI' : 20.0, /* */ 'BMI' : 20.0, /* */ 'bodyfat' : 20.0, /* */ 'bodytone' : 30.0, /* */ }, 'NAMES': { 'first' : "Sue", 'full' : "Susan G Marien", 'legal' : "Susan Gina Wynter-Marien", 'birth' : "Gna Wynter", }, 'PASSAGES':{ 'start' : "START SUE", 'home' : "LIVING IN HOUSE", 'travel' : "WALK SOMEWHERE", }, 'PLACES':{ 'RIVERVALLEY HIGH' : { 'name':"RIVERVALLEY HIGH", 'PASSAGE':"RIVERVALLEY HIGH", 'visits':406, }, }, 'POWERS':{ 'xSTR':{ 'label' : 'Super-Strength', 'rank' : 3.0, }, }, 'PROPERTY':{ /* no car */ }, 'S':{ 'STR' :{ 'base': 54.00, 'pow': 3.00, 'PERM':{}, 'TEMP':{}, '~cache':1, }, 'PHY' :{ 'base': 69.00, 'pow': 0.00, 'PERM':{}, 'TEMP':{}, '~cache':1, }, 'WSD' :{ 'base': 37.00, 'pow': 0.00, 'PERM':{}, 'TEMP':{}, '~cache':1, }, 'END' :{ 'base': 72.00, 'pow': 0.00, 'PERM':{}, 'TEMP':{}, '~cache':1, }, 'SPD' :{ 'base': 66.00, 'pow': 0.00, 'PERM':{}, 'TEMP':{}, '~cache':1, }, 'INS' :{ 'base': 41.00, 'pow': 0.00, 'PERM':{}, 'TEMP':{}, '~cache':1, }, 'CALC' :{ 'Lv' : 44.00, 'Cal' : 8.00, 'Mag' : 3.00, 'Cap' : 11.00, 'workout_hrs' : 11.00, 'light_well' : 11.00, 'dark_well' : 11.00, }, }, 'SKILLS':{}, 'SLAVES':{}, 'STATE':{ 'saveVersion' : 0.258, 'feedbackQueue' : [], 'Date' : new Date(), 'lastPassage' : null, 'lastExercise' : null, 'lastActivity' : null, 'lastAction' : null, 'lastItem' : null, }, 'STATUS':{}, 'STUFF':{ /* ID:uses */ 'D01_A09_I02': 60, /* jeans */ 'D01_A10_I02': 30, /* T-shirt */ 'D01_A13_I02': 50, /* plain white bra */ 'D01_A13_I03': 50, /* plain white panties */ 'D01_A13_I01': 13, /* ankle socks */ }, 'TRAITS':{ 'gender' : "female", 'species' : "human", /* 'skin_type' : "", */ /* 'skin_color' : "", */ /* 'skin_condition' : "", */ /* 'hair_length' : "", */ /* 'hair_color' : "", */ /* 'hair_style' : "", */ /* 'hair_condition' : "", */ /* 'eye_color' : "", */ /* 'eye_condition' : "", */ /* 'face' : "", */ }, /* END setup.CHARS['Susan Marien'] */ }>>
<p>You wake from the weirdest dream... maybe, like, you should cut way back on the zombie flicks.</p> <p>...</p> <<run setup.ALIAS.setTime(15,18)>> <p>The next day after school, you finally have a chance to talk to Kyra about it; she's been your best friend and only confidant since you met in 3rd grade, but lately she's been acting a bit weird around you.</p> <p><span class='npc_reaction female'>"Hey, bitch"</span>, she greets you with a warm smile as she comes in for a hug. Her embrace feels nicer than you'd care to admit, and it's not long before you have to pull away, the tip of your nose tingling as you feel the beginnings of arousal.</p> <p>You yak for awhile, but finally tell her about the dream...</p> <p><span class='npc_reaction female'>"Really... a vampire?"</span></p> <p><span class='npc_reaction female'>"Well, what about that goth kid in fourth period?"</span>, you ask.</p> <p><span class='npc_reaction female'>"Oh please, Eddie Needle-tooth? He's just a tickle-me emo that likes glitter! You couldn't spot a real vampire in a crowd... they'd look totally normal. And with your bare-hands? Puh-lease. But whatevs, bitch, I have studying- later!"</span>, and she starts walking off, turning back a moment later to add, <span class='npc_reaction female'>"Hey, that Erik guy says you two are totally a thing... like, is that real or do you want me to kick him in the dick?"</span>. </p> <p>You catch a hopeful glint out of the corner of her eye, but aren't quite sure what to make of it... either way the answer is the same, <span class='npc_reaction female'>"kick him"</span>, you shout as you turn toward the street. You wonder if she's really into you or just playing, but right now you have other things to worry about...</p> <p>What was that about super-human strength? You don't feel any different... not that you've ever been weak. Last time you were at the bench, you almost broke 5 plates on each side- perhaps you could test this new power out? But first, you should probably <span class='keypress' key='[SPACE]'>[[go home->GO HOME]]</span>.</p>
<<set _time=setup.ALIAS.getTime('24'); >> <<replace '#datetime'>><<include 'DATETIME'>><</replace>> <<if (_time>'06:59')&&(_time<'17:45') >> <<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <h2>RIVER VALLEY HIGH</h2> <</if>> <<print setup.ALIAS.afterPassage();>> <p></p> <<print setup.ALIAS.exitPassage();>> <<else>> <<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <p>You see a sign that reads, "SORRY, WE'RE CLOSED RIGHT NOW. PLEASE COME BACK AFTER 07:00 AM".</p> <p>What do you do?</p> <div><<print setup.ALIAS.exitPassage();>></div> <</if>> <</if>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>>
<div class='left framed'> <p>ACTIONS</p> <p>What will you do today?</p> <p></p> <<include "ACTIONS HOUSE">> <p></p> <<print setup.ALIAS.menuList_long(); >> </div>
<p class='narrow'><<if setup.ALIAS.canDo('REST', 'sleep', 3, 1.0, $G.PC) >>[[SLEEP FOR 8 HOURS->SLEEP IN BED]]<</if>></p> <p class='narrow'><<if setup.ALIAS.canDo('REST', 'sleep', 1, 1.0, $G.PC) >>[[TAKE A 2 HOUR NAP->TAKE A NAP]]<</if>></p> <p class='narrow'><<if setup.ALIAS.canDo('REST', 'rest', 15/60, 1.0, $G.PC) >>[[REST FOR 20 MIN->REST A BIT]]<</if>></p> <p></p> <p class='narrow'><<if setup.ALIAS.canDo('EXPLORE', 'search', 45/60, 1.0, $G.PC) >>[[WALK TO GYM->GYM]]<</if>></p> <p class='narrow'><<if setup.ALIAS.canDo('EXPLORE', 'search', 90/60, 1.0, $G.PC) >>[[WALK TO SCHOOL->RIVERVALLEY HIGH]]<</if>></p> <p></p> <p class='narrow'><<print setup.ALIAS.carOrCab($G.PC);>></p> <p class='narrow'><<if setup.ALIAS.canDo('EXPLORE', 'search', 30/60, 1.0, $G.PC) >>[[LOOK FOR CHANGE]]<</if>></p> <p></p> <p class='narrow'><<if setup.ALIAS.canDo('TRAIN', 'walk', 5/60, 0.5, $G.PC) >>[[GO FOR A WALK]]<</if>></p> <p class='narrow'><<if setup.ALIAS.canDo('TRAIN', 'jog', 5/60, 0.5, $G.PC) >>[[GO FOR A JOG]]<</if>></p> <p class='narrow'><<if setup.ALIAS.canDo('TRAIN', 'run', 5/60, 0.5, $G.PC) >>[[GO FOR A RUN]]<</if>></p> <p></p> <p class='narrow'><<if setup.ALIAS.canDo('TRAIN', 'aerobics', 5/60, 0.5, $G.PC) >>[[DO AEROBICS]]<</if>></p> <p class='narrow'><<if setup.ALIAS.canDo('TRAIN', 'calisthenics', 5/60, 0.5, $G.PC) >>[[DO CALISTHENICS]]<</if>></p> <p class='narrow'><<if setup.ALIAS.canDo('TRAIN', 'yoga', 5/60, 0.5, $G.PC) >>[[DO YOGA]]<</if>></p>
<p class='wide'>...</p> <<print setup.ALIAS.char_appearance(_OOGLE);>> <p></p> <p></p> <p></p> <p class='keypress' key='[ESC]'><<link 'RETURN'>><<run setup.ALIAS.menuHide();>><</link>></p>
<<set setup.LOCATIONS={ /* (replaces setup.PASSAGES!) */ /* DESIGN TO BE CMS COMPATIBLE, MAX DEPTH=1 SUB-LEVEL! */ /* locations are a subtype of CHAMBER/CONTAINER */ /* can be a sub-location, such as a store in the mall, BUT remember these LOCATIONS are meant for map-navigation! We could pull all locations with parent-map of RiverValley or of Current-Street/Block */ 'PROTOTYPE LOCATION' :{ 'type':'(Static|Dynamic) Location', 'passage':'(<PASSAGE NAME>|null)', 'prototype_id':'<Prototype ID>', /* this setup.LOCATIONS entry IS the PROTOTYPE, but this property must be present in the instance to get root gamedata */ 'name':'<Display Name>', /* will later act as inertial reference frame */ 'parent_id':'(<Location/Container ID>|<City/World ID>|null)', 'address':'<Location within Parent Map>', /* parent type will determine address format */ 'map_id':'<Map ID>', /* navigational and layout information */ 'property_id':'(<Property ID>|null)', /* financial and zoning information */ 'setup' : function() { $G.PC.STATE.lastPassage = State.passage; $G.PC.STATE.passageDesc = either('here'); return null; }, 'exit' : function() { setup.ALIAS.showSideBar(); return "<<print setup.ALIAS.carOrCab($G.PC);>>"; }, /* will be replaced with SITUATIONS */ 'ENCOUNTERS':{ 'nothing' : function() { return 72; }, }, 'SCHEDULE':{}, 'NPCS':{}, 'CHAMBERS':{ /* may contain setup.STRUCTURES.id, setup.LOCATIONS.id, or setup.ROOMS.id */ '<child id>':'(structure|location|room|other-chamber)', /* child type */ }, }, }>>
<<set setup.PROPERTIES={ /* Real Estate */ 'PROTOTYPE PROPERTY':{ /* do we leave off liens, mortgages, assessments, taxes, etc. for now... OR, should we reserve the space? */ 'OWNERS': { '<NPC ID>': 1.00, /* percentage partnership, must add to 1.0 */ }, 'TENANTS': { '<NPC ID>': 1.00, /* percentage partnership, must add to 1.0 */ }, 'zoning':'(Residential|Commercial|Industrial|Preserve|Undeveloped-Private Land|Undeveloped-Public Land)', 'acres':0, 'land value': 0, 'improvement value': 0, /* cached value for all structures */ 'land value': 0, }, }>>
<<set setup.ROOMS={ /* Rooms... */ 'PROTOTYPE ROOM':{ }, }>>
<<set setup.STRUCTURES={ /* Buildings... */ 'PROTOTYPE STRUCTURE':{ }, }>>
<<set setup.SITUATIONS={ /* Random Plot Situations, may require or summon NPCs and other Objects */ /* (replaces setup.PASSAGES!) */ 'PROTOTYPE SITUATION':{ }, }>>
<<set setup.TRAITS={ /* Epigenetic Traits... */ 'body.organs.type' : ['none', 'Aerobic.Earth.Mammal',], 'body.surface.cover.type' : ['none', 'hair', 'fur', 'feathers', 'chitin', 'scales', 'flame', ], 'body.surface.cover.desc' : '', 'body.surface.skin.color' : { '_' : '<cached color>', 'base' : [], 'modifiers' : {}, }, 'body.surface.skin.pattern' : ['none', 'solid', 'patched', 'striped', 'spotted'], 'body.surface.fur.pattern' : ['none', 'solid', 'patched', 'striped', 'spotted'], 'body.surface.skin.freckles' : {}, 'body.surface.skin.moles' : {}, 'body.surface.skin.scars' : {}, 'body.surface.skin.burns' : {}, 'body.surface.skin.acne' : {}, 'body.surface.skin.boils' : {}, 'body.surface.skin.calluses' : {}, 'body.surface.skin.blisters' : {}, 'body.surface.skin.bruises' : {}, 'body.surface.skin.scabs' : {}, 'body.surface.skin.lacerations' : {}, 'body.surface.skin.hair' : {}, 'body.surface.skin.tattoos' : {}, 'body.surface.skin.piercings' : {}, 'body.surface.skin.implants' : {}, 'body.surface.skin.makeup' : {}, 'body.surface.skin.bodypaint' : {}, 'body.skeleton.primary' : ['none', 'exo', 'endo', ], 'body.skeleton.exo' : ['none', 'Exoskeleton.Earth.Vertebrate', 'cybernetic'], 'body.skeleton.endo' : ['none', 'Endoskeleton.Earth.Crustacean', 'cybernetic'], 'body.head.size' : '', 'body.head.shape' : '', 'body.face.shape' : '', 'body.face.eye_shape' : '', 'body.face.mouth_shape' : '', 'body.face.skin.freckles' : {}, 'body.face.skin.moles' : {}, 'body.face.skin.scars' : {}, 'body.face.skin.burns' : {}, 'body.face.skin.acne' : {}, 'body.face.skin.boils' : {}, 'body.face.skin.calluses' : {}, 'body.face.skin.blisters' : {}, 'body.face.skin.bruises' : {}, 'body.face.skin.scabs' : {}, 'body.face.skin.lacerations' : {}, 'body.face.skin.hair' : {}, 'body.face.skin.tattoos' : {}, 'body.face.skin.piercings' : {}, 'body.face.skin.implants' : {}, 'body.face.skin.makeup' : {}, 'body.face.skin.bodypaint' : {}, 'body.face.eyebrows.color' : '', 'body.face.eyebrows.shape' : '', 'body.face.eyebrows.size' : '', 'body.face.eyebrows.tattoos' : '', 'body.face.eyebrows.piercings' : '', 'body.face.eyebrows.implants' : '', 'body.eyes.count' : 2, 'body.eyes.pupil.shape' : ['none', 'round', 'stigma', 'double', 'feline', 'draconic', 'multi', 'hourglass', 'star', 'serpentine', 'compound'], 'body.eyes.pupil.size' : '', 'body.eyes.pupil.dialation' : '', 'body.eyes.iris_color' : ['none', 'brown', 'blue', 'green', 'hazel', 'gray', 'black', 'white', 'violet', 'red', ], 'body.eyes.sclera_color' : ['none', 'white', 'bloodshot', 'jaundiced', ], 'body.mouth.count' : 1, 'body.mouth.size' : '', 'body.mouth.type' : '', 'body.mouth.lip.size' : '', 'body.mouth.lip.shape' : '', 'body.mouth.lip.color' : '', 'body.mouth.lip.condition' : '', 'body.teeth.type' : '', 'body.teeth.color' : '', 'body.teeth.size' : '', 'body.teeth.shape' : '', 'body.nose.type' : '', 'body.nose.size' : '', 'body.nose.shape' : '', 'body.limbs.arms.count' : 2, 'body.limbs.arms.joints' : 3, 'body.limbs.arms.terminus' : ['none', 'hands', 'paws', 'pincers', 'talons', 'hooves', 'feet', ], 'body.limbs.legs.count' : 2, 'body.limbs.legs.joints' : 3, 'body.limbs.legs.terminus' : ['none', 'feet', 'paws', 'pincers', 'talons', 'hooves', 'hands', ], 'body.limbs.tentacles.count' : 0, 'body.limbs.tentacles.type' : ['none', 'cephalopod', 'hentai', 'vines', 'stinger' ], 'body.limbs.tentacles.desc' : '', 'body.limbs.tails.count' : 0, 'body.limbs.tails.type' : ['none', 'canine', 'feline', 'reptilian', 'avian', 'serpentine', 'stinger', 'lagomorphic', 'equine', 'draconic', 'demonic', 'scorpid', ], 'body.limbs.tails.desc' : '', 'body.limbs.tails.terminus' : ['none', 'stinger', 'rattle', 'tuft', 'barb', 'spade', 'spines', ], 'body.limbs.wings.count' : 0, 'body.limbs.wings.type' : ['none', 'avian', 'reptilian', 'chiropteran', 'draconic', 'insectoid', ], 'body.limbs.wings.desc' : '', 'body.dorsal_ridge.type' : ['none', 'dorsal-fin', 'fin-ridge', 'spines', 'plates', 'horns', 'cybernetic exo-spine', ], /* additional traits still needed for gender and reproductive system */ }>>
<<run setup.ALIAS.setTime(1,14)>> <p>Five years. Eighteen hundred and twenty seven days in that place. You aren't the <i><b>little</b> girl</i> you were when you went in.</p> <p>They almost bought it, bein' a statutory case and all, they almost called it self-defense. Maybe you shouldn'a used a belt, and whipped his sorry ass around by his new collar like the <i><b>dog</b></i> he was. Maybe you shouldn'a drug his skank ass over to the toilet for a <i><b>drink</b></i>. Maybe you shouldn'a stripped him down an' beat his lyin' ass until he pissed the carpet, then <i><b>rubbed his face in it</b></i> 'til it bled. And maybe, maybe you should'a taken your lawyer's advice and not let that skinny ass prosecutor bitch goad ya... <i>damn, she was fine too</i>. Fuck, you been in the joint too long... even people you <b>hate</b> are gettin' you wet.</p> <p>Five years and his punk ass got off with eight months... well, at least he spent most of that chained to a <b>hospital bed</b> with a tube up his cheatin' dick. Motherfucka was goin' to town on some passed out chick he had in <i><b>YOUR bed!</b></i> Whatever the fuck she was on, your rough <i><b>pet play</b></i> didn't even wake her ass up. <i>And what an ass she had</i>- dammit, you need to get your ass laid tonight! Wonder what that motherfucker is up to... nah, you can do better than that tiny brokedick motherfucka.</p> <p>Aw, shit... you just remembered how bad his dick got fucked up, yo'. All that <i><b>bad dog</b></i> shit got is perverted ass hard, an' y'all made him hump the floor with that toothpick. How the hell you ever found that tictac satisfying you'll never know... maybe it was because you were just 14 at the time, an' all tiny- or maybe it's cause he was your first real boyfriend, and he acted all romantic and shit. And maybe it was 'cause you'd do <i><b>anything</b></i> to get out of that fucked up home.</p> <p>Yo' mamma gave your sorry ass up at birth, then your adoptive parents had to go and die when you's jus' nine, and in the damned car with'em. Then you spent the next four and a half years bouncing 'tween fosters, 'til you got so sick of that shit you latched on to the first nice guy you found. Motherfucka was in college, and he pretended in court that he didn't know y'all was a minor. <i>Ya know, he look good in a wheelchair... maybe you should pay him a visit sometime</i>- shit, you don't care if it's dick, tongue, or a damned rubber dong, you need something in yo' pussy tonight!</p> <p>You ain't sure if it's somethin' you did, or jus' yo' genes, but yo'r kitty grown so much that ain't no man can satisfy you proper...</p> <p>Be nice if that was yo' only problem... but you ain't got no money, no family, and nowhere to go. Yo' ass is out of prison, and straight onto the street. At least you don't have to deal with no probation or parole, having been a minor going in, but you ain't got no halfway house neither. Your gonna need some money soon, <span class='keypress' key='[SPACE]'>[[better go see what you can wrangle up->GO HOME]]</span>.</p>
<<set setup.CHARS['Leona Lee'] = { '_':{ 'build_lv':'public', }, 'ABOUT':{ 'who_is':'homeless ex-con', }, 'BODY':{ 'Calves' :{ 'train': 8.7, 'damage':2.1, }, 'Quads' :{ 'train':10.7, 'damage':2.2, }, 'Hams' :{ 'train': 9.1, 'damage':2.4, }, 'Glutes' :{ 'train': 9.9, 'damage':2.7, }, 'Hips' :{ 'train': 9.1, 'damage':2.0, }, 'LoBack' :{ 'train': 8.4, 'damage':2.1, }, 'Lats' :{ 'train': 8.6, 'damage':1.7, }, 'Traps' :{ 'train': 9.6, 'damage':1.2, }, 'Abs' :{ 'train':10.2, 'damage':1.8, }, 'Pecs' :{ 'train':10.5, 'damage':1.9, }, 'Delts' :{ 'train':10.8, 'damage':3.6, }, 'LeftTri' :{ 'train': 9.1, 'damage':2.4, }, 'RightTri' :{ 'train': 9.1, 'damage':2.4, }, 'LeftBi' :{ 'train':10.9, 'damage':3.1, }, 'RightBi' :{ 'train':10.4, 'damage':3.1, }, 'LeftFore' :{ 'train': 9.7, 'damage':3.6, }, 'RightFore' :{ 'train': 9.2, 'damage':3.6, }, 'LeftGrip' :{ 'train':10.9, 'damage':2.9, }, 'RightGrip' :{ 'train':10.4, 'damage':2.9, }, 'Cardio' :{ 'train': 9.8, 'damage':2.1, }, 'Kegel' :{ 'train':10.9, 'damage':4.7, }, 'Brain' :{ 'train': 9.2, 'damage':3.1, }, }, 'DEVICES':{}, 'ENEMIES':{}, 'EQUIP':{ /* SLOT:ID */ 'panties' :"D01_A13_I03", 'pants' :"D01_A09_I02", 'shirt' :"D01_A10_I02", 'socks' :"D01_A13_I01", 'undershirt':"D01_A02_I01", }, 'EXSLAVES':{}, 'FRIENDS':{}, 'JUNK':{}, 'LIMBS':{ 'ARML':{ 'total': 8.0, 'min': 8.0, 'parts': 8.0, 'avg':1.0, 'pct':1.0, }, 'ARMR':{ 'total': 8.0, 'min': 8.0, 'parts': 8.0, 'avg':1.0, 'pct':1.0, }, 'ARMS':{ 'total':12.0, 'min':12.0, 'parts':12.0, 'avg':1.0, 'pct':1.0, }, 'CORE':{ 'total': 5.0, 'min': 5.0, 'parts': 5.0, 'avg':1.0, 'pct':1.0, }, 'LEGL':{ 'total': 6.0, 'min': 6.0, 'parts': 6.0, 'avg':1.0, 'pct':1.0, }, 'LEGR':{ 'total': 6.0, 'min': 6.0, 'parts': 6.0, 'avg':1.0, 'pct':1.0, }, 'LEGS':{ 'total': 6.0, 'min': 6.0, 'parts': 6.0, 'avg':1.0, 'pct':1.0, }, 'SEXX':{ 'total': 7.0, 'min': 7.0, 'parts': 7.0, 'avg':1.0, 'pct':1.0, }, }, 'LOVERS':{}, 'M':{ 'WEIGHT' :{ 'BODY' :{ 'bone' : 11.00, 'fat' : 47.00, 'muscle' : - 33.00, 'organs' : 30.00, }, 'CACHE' :{}, 'CALC' :{ 'scale' : 0.98, 'fatPct' : 0.25, 'musclePct' : 0.30, 'tonePct' : 0.20, 'bmi' : 20.00, }, 'SCALED' :{ 'body' : 138.0, }, 'updated' : Date.now(), }, }, 'MATRIX':{ /* SECONDARY STATS/ENERGY - current values (renewable resources) */ 'vigor' : 50.0, /* STR+PHY - [P] stamina */ 'train' : 50.0, /* STR+WSD - [H] discipline/training */ 'tough' : 50.0, /* STR+END - [P] resistance to damage */ 'power' : 50.0, /* STR+SPD - [P] physical force/lift */ 'skill' : 50.0, /* STR+INS - [H] precision/accuracy */ 'aware' : 50.0, /* PHY+WSD - [H] alertness to environment */ 'vital' : 50.0, /* PHY+END - [P] health */ 'metab' : 50.0, /* PHY+SPD - [P] metabolism */ 'focus' : 50.0, /* PHY+INS - [H] attention to detail */ 'guard' : 50.0, /* WSD+END - [H] active defense */ 'react' : 50.0, /* WSD+SPD - [H] defensive speed/reaction time */ 'psych' : 50.0, /* WSD+INS - [M] psionic energy */ 'regen' : 50.0, /* END+SPD - [P] regeneration/healing */ 'force' : 50.0, /* END+INS - [H] force of will */ 'fight' : 50.0, /* SPD+INS - [H] offensive speed/action time */ /* RESOURCES - (non-stat/non-renewable) */ 'light' : 40.00, /* ? unit */ 'dark' : 160.00, /* ? unit */ 'kcal' : 243.00, /* food calories consumed, total */ 'protein' : -327.00, /* grams consumed, nutrition */ 'sugar' : 234.00, /* grams consumed, empty calories */ 'money' : 5.00, /* */ 'petro' : 0.000001, /* gallons, remaining */ }, 'METRICS':{ 'age' : 19.0, /* */ 'base_ht' : 72.0, /* height, inches */ 'ht' : 62.0, /* height, inches */ 'bicep' : 11.0, /* inches; */ 'quads' : 19.0, /* inches; */ 'chest' : 28.0, /* */ 'bust' : 1.0, /* base cup size */ 'cup' : "B", /* */ 'waist' : 22.0, /* */ 'hips' : 31.0, /* */ 'BMI' : 20.0, /* */ 'bodyfat' : 15.0, /* */ 'bodytone' : 45.0, /* */ }, 'NAMES': { 'first' : "Leona", 'full' : "Leona", 'legal' : "Leona Lee", 'birth' : "Leona Carpenter", }, 'PASSAGES':{ 'start' : "START LEONA", 'home' : "LIVING ON STREET", 'travel' : "WALK SOMEWHERE", }, 'PLACES':{ /* PRISON -- 5 years! */ 'PRISON' : { 'name':"PRISON", 'PASSAGE':"PRISON", 'visits':1826, }, }, 'POWERS':{ 'xSTR':{ 'label' : 'Super-Strength', 'rank' : 1.0, }, 'xSPD':{ 'label' : 'Super-Speed', 'rank' : 1.0, }, 'xINS':{ 'label' : 'Super-Instinct', 'rank' : 1.0, }, }, 'PROPERTY':{ /* no car */ }, 'S':{ 'STR' :{ 'base': 61.00, 'pow': 1.00, 'PERM':{}, 'TEMP':{}, '~cache':1, }, 'PHY' :{ 'base': 48.00, 'pow': 0.00, 'PERM':{}, 'TEMP':{}, '~cache':1, }, 'WSD' :{ 'base': 31.00, 'pow': 0.00, 'PERM':{}, 'TEMP':{}, '~cache':1, }, 'END' :{ 'base': 46.00, 'pow': 0.00, 'PERM':{}, 'TEMP':{}, '~cache':1, }, 'SPD' :{ 'base': 59.00, 'pow': 1.00, 'PERM':{}, 'TEMP':{}, '~cache':1, }, 'INS' :{ 'base': 44.00, 'pow': 1.00, 'PERM':{}, 'TEMP':{}, '~cache':1, }, 'CALC' :{ 'Lv' : 42.00, 'Cal' : 8.00, 'Mag' : 3.00, 'Cap' : 11.00, 'workout_hrs' : 11.00, 'light_well' : 11.00, 'dark_well' : 11.00, }, }, 'SKILLS':{}, 'SLAVES':{}, 'STATE':{ 'saveVersion' : 0.258, 'feedbackQueue' : [], 'Date' : new Date(), 'lastPassage' : null, 'lastExercise' : null, 'lastActivity' : null, 'lastAction' : null, 'lastItem' : null, }, 'STATUS':{}, 'STUFF':{ /* ID:uses */ 'D01_A09_I02': 60, /* jeans */ 'D01_A10_I02': 30, /* T-shirt */ 'D01_A13_I02': 50, /* plain white bra */ 'D01_A13_I03': 50, /* plain white panties */ 'D01_A13_I01': 13, /* ankle socks */ }, 'TRAITS':{ 'gender' : "female", 'species' : "human", /* 'skin_type' : "", */ /* 'skin_color' : "", */ /* 'skin_condition' : "", */ /* 'hair_length' : "", */ /* 'hair_color' : "", */ /* 'hair_style' : "", */ /* 'hair_condition' : "", */ /* 'eye_color' : "", */ /* 'eye_condition' : "", */ /* 'face' : "", */ }, /* END setup.CHARS['Leona'] */ }>>
<<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<replace '#datetime'>><<include 'DATETIME'>><</replace>> RIVERSIDE PARK <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>>
<<set _time=setup.ALIAS.getTime('24'); >> <<replace '#datetime'>><<include 'DATETIME'>><</replace>> <<if (_time>'08:59')&&(_time<'17:00') >> <<set _showTheGoodStuff=setup.ALIAS.worldVarGet('parkhaven.givenShards');>> <<if !_section>> <<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<set $G.WORLD.girlPower += 0.016;>> <h2>PARKHAVEN NEW AGE BOOKSTORE</h2> <p><<linkreplace 'TALK TO OWNER'>> <<if (!setup.ALIAS.worldVarGet('parkhaven.metAlice'))>> <<set setup.ALIAS.worldVarSet('parkhaven.metAlice', true);>> <p>As you approach the counter, you see a tall blonde woman who introduces herself as Alice.</p> <p><span class='npc_reaction female'>"Welcome, I try to keep this a positive space. Feel free to look around... let me know if you have any questions."</span></p> <<elseif (setup.ALIAS.getBalanceDark($G.PC)>0.5)>> <p>Alice eyes you warily.</p> <p><span class='npc_reaction female'>"Please leave your darkness at the door."</span></p> <<else>> <p>Alice welcomes you back.</p> <p><span class='npc_reaction female'>"Good to see you again, friend. What is it you seek?"</span></p> <</if>> <!-- Alicia Welstrom ? --> <<print setup.ENCOUNTERS.AliciaWelstrom.CHOICES.haveShards();>> <</linkreplace>></p> <<if(_showTheGoodStuff)>><<print "<p class='"+(_showTheGoodStuff==1 ? 'new' : '')+"'><<link 'ARTIFACTS' >><<set _section='artifacts' >><<print setup.ALIAS.reloadPassage();>><</link>></p>";>> <</if>> <p><<link 'BOOKS' >><<set _section='books' >><<print setup.ALIAS.reloadPassage();>><</link>></p> <p><<link 'CANDLES' >><<set _section='candles' >><<print setup.ALIAS.reloadPassage();>><</link>></p> <p><<link 'CRYSTALS' >><<set _section='crystals' >><<print setup.ALIAS.reloadPassage();>><</link>></p> <p><<link 'OILS & BALMS' >><<set _section='oils' >><<print setup.ALIAS.reloadPassage();>><</link>></p> <<if(_showTheGoodStuff)>><<print "<p class='"+(_showTheGoodStuff==1 ? 'new' : '')+"'><<link 'POTIONS' >><<set _section='potions' >><<print setup.ALIAS.reloadPassage();>><</link>></p>";>> <</if>> <p><<link 'READINGS' >><<set _section='readings' >><<print setup.ALIAS.reloadPassage();>><</link>></p> <!-- <p><<linkreplace '!LOOK AROUND' >>...<</linkreplace>></p> --> <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>> <<else>> <<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <<switch _section>> <<case 'artifacts' >><h3>ARTIFACTS</h3> <!-- --> <p>(rare)</p> <p class='keypress' key='[ESC]'><<link 'RETURN'>><<unset _section>><<print setup.ALIAS.reloadPassage();>><</link>></p> <<case 'books' >><h3>BOOKS</h3> <!-- <p>(must be familiar with both the Polaris and Luna texts?)</p> <p>(keywords/variables to discuss magic-theory?)</p> --> <<if(_showTheGoodStuff)>> <p>(keywords/variables to discuss magic-theory?)</p> <</if>> <p class='keypress' key='[ESC]'><<link 'RETURN'>><<unset _section>><<print setup.ALIAS.reloadPassage();>><</link>></p> <<case 'candles' >><h3>CANDLES</h3> <!-- <p>warding (repels evil spirits, reduces dark-encounter rates, leads to alternate V encounter - votive 15h indoors 3-7h outdoors, won't work in bad weather)</p> --> <<if(_showTheGoodStuff)>> <</if>> <p class='keypress' key='[ESC]'><<link 'RETURN'>><<unset _section>><<print setup.ALIAS.reloadPassage();>><</link>></p> <<case 'crystals' >><h3>CRYSTALS</h3> <!-- <p>(note: precious stones are very rare here, but clean... bought elsewhere they may come with a lot of suffering...)</p> <p>(note: translation ^^^ ~ gems here are light, gems from S-Mart are very dark-auraed)</p> <p>focusing</p> <p>orb</p> <p>mystic quartz (multi-color)</p> <p>alexandrite (changes color indoors)</p> <p>(?elemental stones?)</p> <p>garnet (?pyrium)</p> <p>topaz (?territe)</p> <p>peridot (?)</p> <p>aquamarine (?)</p> <p>tanzanite (?)</p> <p>amythest (?)</p> <p>(?chakra stones?)</p> --> <<if(_showTheGoodStuff)>> <</if>> <p class='keypress' key='[ESC]'><<link 'RETURN'>><<unset _section>><<print setup.ALIAS.reloadPassage();>><</link>></p> <<case 'oils' >><h3>OILS & BALMS</h3> <<print setup.ALIAS.itemCard('items.Oils.Engorgement');>> <<print setup.ALIAS.itemCard('items.Oils.Withering');>> <!-- <p>(key to learning of potions?)</p> <p>(note: balms will reduce lust, oils raise it...)</p> <p>healing balm (damage + some qi)</p> <p>fat-burning balm</p> <p>anti-aging...</p> <p>energizing (removes fatigue, adds some qi/stam)</p> --> <<if(_showTheGoodStuff)>> <</if>> <p class='keypress' key='[ESC]'><<link 'RETURN'>><<unset _section>><<print setup.ALIAS.reloadPassage();>><</link>></p> <<case 'potions' >><h3>POTIONS</h3> <!-- <p>(must get her to talk about brewing, first)</p> --> <<if(_showTheGoodStuff)>> <</if>> <p class='keypress' key='[ESC]'><<link 'RETURN'>><<unset _section>><<print setup.ALIAS.reloadPassage();>><</link>></p> <<case 'readings' >><h3>READINGS</h3> <!-- --> <<if(_showTheGoodStuff)>> <</if>> <p class='keypress' key='[ESC]'><<link 'RETURN'>><<unset _section>><<print setup.ALIAS.reloadPassage();>><</link>></p> <</switch>> <</if>> <<print setup.ALIAS.afterPassage();>> <p></p> <</if>> <<else>> <<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <p>You see a sign that reads, "SORRY, WE'RE CLOSED RIGHT NOW. PLEASE COME BACK AFTER 09:00 AM".</p> <p>What do you do?</p> <div><<print setup.ALIAS.exitPassage();>></div> <</if>> <</if>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>>
<<set setup.DATA={};>> <<include DATA.OPTIONS>> <<include DATA.ITEMS>> <<include DATA.ONUSE>> <<include DATA.SPECIES>> <<include DATA.NPCS>>
<<set setup.SYS={};>> <<include 'SYS.MAIN'>> <<include 'SYS.MATH'>> <<include 'SYS.TEXT'>> <<include 'SYS.UI'>>
<<set var sSM=setup.SYS.MAIN; var sS0=setup.SYS.MATH; var sSI=setup.SYS.UI; var sST=setup.SYS.TEXT; setup.ALIAS={ /* SYS.MAIN */ 'engineVersion' : sSM.engineVersion, 'contentVersion' : sSM.contentVersion, 'gameVersion' : sSM.gameVersion, 'buildVersion' : sSM.buildVersion, 'contentSite' : sSM.contentSite, 'modVersion' : sSM.modVersion, 'versionUpdate' : sSM.versionUpdate, 'addItem' : sSM.addItem, 'afterPassage' : sSM.afterPassage, 'after_update' : sSM.after_update, 'after_use' : sSM.after_use, 'azIScaleStats' : sSM.azIScaleStats, 'beforePassage' : sSM.beforePassage, 'before_update' : sSM.before_update, 'before_use' : sSM.before_use, 'brokeTime' : sSM.brokeTime, 'buyItem' : sSM.buyItem, 'calcBodyMass' : sSM.calcBodyMass, 'calcReps' : sSM.calcReps, 'canDo' : sSM.canDo, 'canDoLift' : sSM.canDoLift, 'carOrCab' : sSM.carOrCab, 'causeOfDeath' : sSM.causeOfDeath, 'cdb_parseCompressedObject' : sSM.cdb_parseCompressedObject, 'cdb_parseConditionals' : sSM.cdb_parseConditionals, 'cdb_parseTextField' : sSM.cdb_parseTextField, 'cdb_parseValueOperations' : sSM.cdb_parseValueOperations, 'chamber_refreshObjects' : sSM.chamber_refreshObjects, 'charTempVar' : sSM.charTempVar, 'char_appearance' : sSM.char_appearance, 'char_metric' : sSM.char_metric, 'char_select_menu' : sSM.char_select_menu, 'check_sale' : sSM.check_sale, 'combatAction' : sSM.combatAction, 'combatDrain' : sSM.combatDrain, 'combatHeal' : sSM.combatHeal, 'combatRevive' : sSM.combatRevive, 'combatStrike' : sSM.combatStrike, 'combatTactics' : sSM.combatTactics, 'combatWithdraw' : sSM.combatWithdraw, 'combat_loadP2' : sSM.combat_loadP2, 'combat_refreshAll' : sSM.combat_refreshAll, 'combat_refreshFighterCondition' : sSM.combat_refreshFighterCondition, 'combat_refreshFighterInfo' : sSM.combat_refreshFighterInfo, 'darkAdd' : sSM.darkAdd, 'darkShift' : sSM.darkShift, 'darkSpend' : sSM.darkSpend, 'delItem' : sSM.delItem, 'depleteItem' : sSM.depleteItem, 'desc' : sSM.desc, 'describePassage' : sSM.describePassage, 'developPower' : sSM.developPower, 'doDamageMATRIX' : sSM.doDamageMATRIX, 'doEnergyMATRIX' : sSM.doEnergyMATRIX, 'doExplore' : sSM.doExplore, 'doLift' : sSM.doLift, 'doNutritionMATRIX' : sSM.doNutritionMATRIX, 'doRest' : sSM.doRest, 'doTrainingMATRIX' : sSM.doTrainingMATRIX, 'doWorkout' : sSM.doWorkout, 'do_status_update' : sSM.do_status_update, 'enemyBigger' : sSM.enemyBigger, 'enemyForget' : sSM.enemyForget, 'enemyRemember' : sSM.enemyRemember, 'energyAdd' : sSM.energyAdd, 'energyBleedOff' : sSM.energyBleedOff, 'energySpend' : sSM.energySpend, 'equipItem' : sSM.equipItem, 'exitPassage' : sSM.exitPassage, 'findCash' : sSM.findCash, 'findChange' : sSM.findChange, 'fixDate' : sSM.fixDate, 'foodCard' : sSM.foodCard, 'formatMatrixValue' : sSM.formatMatrixValue, 'generateBlankChar' : sSM.generateBlankChar, 'generateCharFromLicense' : sSM.generateCharFromLicense, 'generateCreature' : sSM.generateCreature, 'generateRandomEncounterMatrix' : sSM.generateRandomEncounterMatrix, 'generateRandomEncounterStats' : sSM.generateRandomEncounterStats, 'generateRandomID' : sSM.generateRandomID, 'generateUID_fromName' : sSM.generateUID_fromName, 'genForSex' : sSM.genForSex, 'getAisleName' : sSM.getAisleName, 'getBalanceDark' : sSM.getBalanceDark, 'getBalanceLight' : sSM.getBalanceLight, 'getDeptName' : sSM.getDeptName, 'getDynamic' : sSM.getDynamic, 'getItem' : sSM.getItem, 'getKarmicBalance' : sSM.getKarmicBalance, 'getName' : sSM.getName, 'getResource' : sSM.getResource, 'getTotalKarma' : sSM.getTotalKarma, 'gym_getMuscles_forWorkout' : sSM.gym_getMuscles_forWorkout, 'gym_getWorkouts_forMuscle' : sSM.gym_getWorkouts_forMuscle, 'gym_listLoadsForWorkout' : sSM.gym_listLoadsForWorkout, 'gym_listMuscles_forWorkout' : sSM.gym_listMuscles_forWorkout, 'gym_listWorkoutsForArea' : sSM.gym_listWorkoutsForArea, 'gym_listWorkouts_forMuscle' : sSM.gym_listWorkouts_forMuscle, 'hlObj_addRootNodes' : sSM.hlObj_addRootNodes, 'itemCard' : sSM.itemCard, 'karmaAdd' : sSM.karmaAdd, 'karmaSpend' : sSM.karmaSpend, 'karma_weightChange' : sSM.karma_weightChange, 'karmic_link' : sSM.karmic_link, 'levelAdd' : sSM.levelAdd, 'lightAdd' : sSM.lightAdd, 'lightShift' : sSM.lightShift, 'lightSpend' : sSM.lightSpend, 'listConditions' : sSM.listConditions, 'listItem_forSale' : sSM.listItem_forSale, 'listMuscleStatus' : sSM.listMuscleStatus, 'listPowers' : sSM.listPowers, 'listPowersSimple' : sSM.listPowersSimple, 'listStats' : sSM.listStats, 'location_discover' : sSM.location_discover, 'location_known' : sSM.location_known, 'lootQty' : sSM.lootQty, 'maxHours' : sSM.maxHours, 'maxResource' : sSM.maxResource, 'metricCalc' : sSM.metricCalc, 'metricTrain' : sSM.metricTrain, 'metric_calcBust' : sSM.metric_calcBust, 'm_add' : sSM.m_add, 'm_get' : sSM.m_get, 'm_set' : sSM.m_set, 'navBuild' : sSM.navBuild, 'navMenu' : sSM.navMenu, 'new_BODY' : sSM.new_BODY, 'npcForget' : sSM.npcForget, 'npcRemember' : sSM.npcRemember, 'oogleLink' : sSM.oogleLink, 'passTime' : sSM.passTime, 'payCost' : sSM.payCost, 'powers_getKnown' : sSM.powers_getKnown, 'powers_getPowerRank' : sSM.powers_getPowerRank, 'powers_getPowerMult' : sSM.powers_getPowerMult, 'powers_hasPowerUnlocked' : sSM.powers_hasPowerUnlocked, 'powerTransfer' : sSM.powerTransfer, 'prepMATRIX' : sSM.prepMATRIX, 'putInBounds' : sSM.putInBounds, 'qiAdd' : sSM.qiAdd, 'qiCalc' : sSM.qiCalc, 'qiFlow' : sSM.qiFlow, 'qiSpend' : sSM.qiSpend, 'randomStat' : sSM.randomStat, 'recoverActive' : sSM.recoverActive, 'recoverPassive' : sSM.recoverPassive, 'regenerateBody' : sSM.regenerateBody, 'removeItem' : sSM.removeItem, 'replacePassage' : sSM.replacePassage, 'secondChance' : sSM.secondChance, 'secondWind' : sSM.secondWind, 'select_char' : sSM.select_char, 'setEncounter' : sSM.setEncounter, 'setupPassage' : sSM.setupPassage, 'shardSpawn' : sSM.shardSpawn, 'slaveCard' : sSM.slaveCard, 'slaveDetails' : sSM.slaveDetails, 'slaveDispose' : sSM.slaveDispose, 'slaveDrain' : sSM.slaveDrain, 'slaveDress' : sSM.slaveDress, 'slaveExamine' : sSM.slaveExamine, 'slaveFeed' : sSM.slaveFeed, 'slaveFight' : sSM.slaveFight, 'slaveFree' : sSM.slaveFree, 'slaveHeal' : sSM.slaveHeal, 'slaveInteractions' : sSM.slaveInteractions, 'slaveMuscle' : sSM.slaveMuscle, 'slavePlayAs' : sSM.slavePlayAs, 'slavePunish' : sSM.slavePunish, 'slaveRefreshCard' : sSM.slaveRefreshCard, 'slaveRename' : sSM.slaveRename, 'slaveTalk' : sSM.slaveTalk, 'slaveTrain' : sSM.slaveTrain, 'slaveUse' : sSM.slaveUse, 'slavesList' : sSM.slavesList, 'species_baseAttr' : sSM.species_baseAttr, 'species_randAttr' : sSM.species_randAttr, 'species_randMetric' : sSM.species_randMetric, 'species_splitAttr' : sSM.species_splitAttr, 'statBuff' : sSM.statBuff, 'statGet' : sSM.statGet, 'statGrow' : sSM.statGrow, 'statPrint' : sSM.statPrint, 'statRefresh' : sSM.statRefresh, 'statSet' : sSM.statSet, 'stealItem' : sSM.stealItem, 'takeHome' : sSM.takeHome, 'trainSTATS' : sSM.trainSTATS, 'updateConditions' : sSM.updateConditions, 'update_bodysize' : sSM.update_bodysize, 'update_slaves' : sSM.update_slaves, 'update_world' : sSM.update_world, 'useItem' : sSM.useItem, 'val' : sSM.val, 'weather_getReport' : sSM.weather_getReport, 'weather_getSunlight' : sSM.weather_getSunlight, 'weightAdd' : sSM.weightAdd, 'weightAdjust' : sSM.weightAdjust, 'weightCalc' : sSM.weightCalc, 'weightCalcScale' : sSM.weightCalcScale, 'weightCalcTone' : sSM.weightCalcTone, 'weightConvert' : sSM.weightConvert, 'weightGet' : sSM.weightGet, 'weightSetMax' : sSM.weightSetMax, 'weightSetMin' : sSM.weightSetMin, 'wildSurge' : sSM.wildSurge, 'wildSurge_boost' : sSM.wildSurge_boost, 'wildSurge_muscleBurst' : sSM.wildSurge_muscleBurst, 'workoutTable' : sSM.workoutTable, 'worldVarAdd' : sSM.worldVarAdd, 'worldVarGet' : sSM.worldVarGet, 'worldVarSet' : sSM.worldVarSet, 'write_epitaph' : sSM.write_epitaph, /* SYS.MATH - BASIC AND RNG FUNCTIONS */ 'forceInRange' : sS0.forceInRange, 'logX' : sS0.logX, 'math_hashString' : sS0.math_hashString, 'math_SPIRNG' : sS0.math_SPIRNG, 'pow' : sS0.pow, 'rand' : sS0.rand, 'rng_chances' : sS0.rng_chances, 'rng_dice' : sS0.rng_dice, 'rng_range' : sS0.rng_range, 'rng_seeded' : sS0.rng_seeded, 'rng_stdev' : sS0.rng_stdev, 'roll' : sS0.roll, 'romanNumeral' : sS0.romanNumeral, 'round2frac' : sS0.round2frac, 'sale_price' : sS0.sale_price, 'scale' : sS0.scale, 'spinTheWheel' : sS0.spinTheWheel, 'sqrt' : sS0.sqrt, 'cbrt' : sS0.cbrt, 'stack' : sS0.stack, 'sumArray' : sS0.sumArray, 'unstack' : sS0.unstack, 'xp_curve' : sS0.xp_curve, /* SYS.MATH - CONVERSION AND FORMATTING FUNCTIONS */ 'bust_UK' : sS0.bust_UK, 'degF2C' : sS0.degF2C, 'formatAsPct' : sS0.formatAsPct, 'formatHeight' : sS0.formatHeight, 'formatLength' : sS0.formatLength, 'formatScale' : sS0.formatScale, 'formatWeight' : sS0.formatWeight, 'formatSignificant' : sS0.formatSignificant, 'in2cm' : sS0.in2cm, 'in2ft' : sS0.in2ft, 'lbs2kg' : sS0.lbs2kg, 'prettyDecimal' : sS0.prettyDecimal, 'splitFloat' : sS0.splitFloat, 'weightScaled' : sS0.weightScaled, /* SYS.MATH - DATE-TIME FUNCTIONS */ 'addDays' : sS0.addDays, 'addHours' : sS0.addHours, 'addMinutes' : sS0.addMinutes, 'addMonths' : sS0.addMonths, 'addSeconds' : sS0.addSeconds, 'addWeeks' : sS0.addWeeks, 'addYears' : sS0.addYears, 'getDate' : sS0.getDate, 'getDay' : sS0.getDay, 'getLongDate' : sS0.getLongDate, 'getMonth' : sS0.getMonth, 'getTime' : sS0.getTime, 'setTime' : sS0.setTime, /* SYS.TEXT - BASIC STRING FUNCTIONS */ 'CSS_safeID' : sST.CSS_safeID, 'kvSplit' : sST.kvSplit, 'regex_capture' : sST.regex_capture, 'trimX' : sST.trimX, /* SYS.TEXT - DESCRIPTIVE FUNCTIONS */ 'a_an' : sST.a_an, 'descAge' : sST.descAge, 'descMissing' : sST.descMissing, 'estAge' : sST.estAge, 'grammar4CHAR' : sST.grammar4CHAR, 'he_she' : sST.he_she, 'He_She' : sST.He_She, 'him_her' : sST.him_her, 'his_her' : sST.his_her, 'His_Her' : sST.His_Her, 'his_hers' : sST.his_hers, 'valMissing' : sST.valMissing, /* SYS.UI - ARRAY FUNCTIONS */ 'default_params' : sSI.default_params, 'firstKey' : sSI.firstKey, 'firstVal' : sSI.firstVal, 'kvSort' : sSI.kvSort, /* SYS.UI - WINDOW FUNCTIONS */ 'abFlicker' : sSI.abFlicker, 'debugClear' : sSI.debugClear, 'debugLog' : sSI.debugLog, 'dialog_hide' : sSI.dialog_hide, 'dialog_show' : sSI.dialog_show, 'dialog_showAs' : sSI.dialog_showAs, 'enc_moreDetail' : sSI.enc_moreDetail, 'enc_showChoices' : sSI.enc_showChoices, 'getFeedback' : sSI.getFeedback, 'giveFeedback' : sSI.giveFeedback, 'updateFeedback' : sSI.updateFeedback, 'guideSubtopics' : sSI.guideSubtopics, 'guideTopic' : sSI.guideTopic, 'hideSideBar' : sSI.hideSideBar, 'menuHide' : sSI.menuHide, 'menuList' : sSI.menuList, 'menuList_icons' : sSI.menuList_icons, 'menuList_long' : sSI.menuList_long, 'menuList_short' : sSI.menuList_short, 'menuShow' : sSI.menuShow, 'menu_showAs' : sSI.menu_showAs, 'powerMeter' : sSI.powerMeter, 'refresh_detail' : sSI.refresh_detail, 'reloadPassage' : sSI.reloadPassage, 'run_abFlicker' : sSI.run_abFlicker, 'showSideBar' : sSI.showSideBar, 'system_getDataSize' : sSI.system_getDataSize, 'system_onLoad' : sSI.system_onLoad, 'system_onSave' : sSI.system_onSave, 'trim_combatLog' : sSI.trim_combatLog, 'wrap' : sSI.wrap, 'WTF' : sSI.WTF, }; >>
<<set setup.SYS.MATH={ /* BASIC MATH AND RANDOM FUNCTIONS */ 'forceInRange' : function(rangeStart, val, rangeEnd) { var min=Math.min(rangeStart, rangeEnd); var max=Math.max(rangeStart, rangeEnd); return Math.max(min, Math.min(val, max)); }, 'logX' : function(base, n, mode) { var abs_n = Math.abs(n); var abs_b = Math.abs(base); var sign = (n/abs_n)*(base/abs_b); var val = Math.log(abs_n) / Math.log(abs_b); if(sign==-1) { switch(mode) { case 'i^2': case '-': case -1: case 'signed': return sign*val; break; case 'i^4': case '+': case 1: case 'unsigned': case 'abs': return val; break; case 'i-i': case '0': case 0: case 'zero': return 0; break; case 'i': case '!': case false: case 'error': default: if(settings.debugModeInfo && console && console.trace) { console.trace(); } throw "Failure of logX to log(x) has been logged by the logger logarithm, and will be sent to Kenny Loggins at his log cabin in Logsville. (ask the dev why the hell he didn't specify +/- mode.)"; break; } } else { return val; } }, 'math_hashString' : function(stringVal) { var hash = 0; if (stringVal.length == 0) return hash; for (i = 0; i < stringVal.length; i++) { char = stringVal.charCodeAt(i); hash = ((hash<<5)-hash)+char; hash = hash & hash; } return hash; }, 'math_SPIRNG' : function(PARAMS) { PARAMS=PARAMS||{}; PARAMS.min=PARAMS.min||0.0; PARAMS.max=PARAMS.max||1.0; PARAMS.id=PARAMS.id||''; /* specify, recall, or generate a seed for given SPRING-id */ PARAMS.seed=PARAMS.seed||setup.TEMP.SPRING[PARAMS.id]||Math.random(); /* hash string-seeds into numeric seeds */ PARAMS.seed=(('string'==PARAMS.seed.typeof) ? setup.ALIAS.math_hashString(PARAMS.seed) : PARAMS.seed); /* modulate the seed to the next position */ PARAMS.seed = (PARAMS.seed * 9301 + 49297) % 233280; /* store the seed for future calls on this SPRING-id */ setup.TEMP.SPRING[PARAMS.id] = PARAMS.seed; /* generate and return a Seedable, Pseudo [Indexed] Random Number Generator result */ return PARAMS.min + (PARAMS.seed / 233280) * (PARAMS.max - PARAMS.min); }, 'pow' : function(base, exp, mode) { var abs = Math.abs(base); var sign = base/abs; var val = Math.pow(abs, exp); if(sign==-1) { switch(mode) { case 'i^2': case '-': case -1: case 'signed': return sign*val; break; case 'i^4': case '+': case 1: case 'unsigned': case 'abs': return val; break; case 'i-i': case '0': case 0: case 'zero': return 0; break; case 'i': case '!': case false: case 'error': default: if(settings.debugModeInfo && console && console.trace) { console.trace(); } throw "oh my, a negative taken to a fractional exponent... whatever shall we do? (ask the dev why the hell he didn't specify +/- mode.)"; break; } } else { return val; } }, 'rand' : function(min, max, round) { /* TODO: convert this into a multi-rand wrapper function, with method selection... */ return setup.ALIAS.rng_range(min, max, round); }, 'rng_chances' : function(rolls, odds) { var win=0; for(var i=0; i<rolls; i++) { win += ((Math.random()<=odds) ? 1 : 0); } return win; }, 'rng_dice' : function(dieCount, dieSides) { var sum=0; for(var i=0; i<dieCount; i++) { sum+=setup.ALIAS.rand(1, dieSides, true); } }, 'rng_range' : function(min, max, round) { min=min||0.0; max=max||1.0; round=round||false; var roll = Math.random(); var retval = roll*(max-min)+min; return (round ? Math.round(retval) : retval); }, 'rng_seeded' : function(seed) { /* TODO: create a multi-instance seedable random sequencer... q. how do we store/load seed-series? */ }, 'rng_stdev' : function(mean, dev, log) { log=log||2; var sE=setup.ALIAS; var sign=(Math.random()<0.5 ? -1 : 1); var deviations= sE.logX(log, 1/Math.random(), '-'); var part=deviations % 1; var full=Math.floor(deviations); return mean + sign*((full*dev)+(part*(dev-0)+dev)); }, 'roll' : function(dice) { var DICE=dice.split('d'); return setup.ALIAS.rng_dice(DICE[0], DICE[1]); }, 'romanNumeral' : function(val, zero) { zero=zero||''; val=Math.trunc(val); if(val<1) { return zero; } /* supports values in the billions */ var ROMAN_NUMERALS={ 'M̿' : 1000000000, 'C̿M̿' : 900000000, 'D̿' : 500000000, 'C̿D̿' : 400000000, 'C̿' : 100000000, 'X̿C̿' : 90000000, 'L̿' : 50000000, 'X̿L̿' : 40000000, 'X̿' : 10000000, 'I̿X̿' : 9000000, 'V̿' : 5000000, 'I̿V̿' : 4000000, 'M̅' : 1000000, 'C̅M̅' : 900000, 'D̅' : 500000, 'C̅D̅' : 400000, 'C̅' : 100000, 'X̅C̅' : 90000, 'L̅' : 50000, 'X̅L̅' : 40000, 'X̅' : 10000, 'I̅X̅' : 9000, 'V̅' : 5000, 'I̅V̅' : 4000, 'M' : 1000, 'CM' : 900, 'D' : 500, 'CD' : 400, 'C' : 100, 'XC' : 90, 'L' : 50, 'XL' : 40, 'X' : 10, 'IX' : 9, 'V' : 5, 'IV' : 4, 'I' : 1, }; var roman=''; for (var i of Object.keys(ROMAN_NUMERALS)) { var q = Math.floor(val / ROMAN_NUMERALS[i]); val -= q * ROMAN_NUMERALS[i]; roman += i.repeat(q); } return roman; }, 'round2frac' : function(val, frac) { return Math.round(val * frac)/frac; }, 'sale_price' : function(cost, discount) { return cost*(1-discount); }, 'scale' : function(base, dimensions, CHAR) { if(!CHAR) { setup.ALIAS.debugLog('scale - NO CHAR!'); } var bio_scale = setup.ALIAS.pow( 1.50, setup.ALIAS.logX(2, CHAR.METRICS.scale, '-') ); var scaled = base * (setup.ALIAS.pow(bio_scale, dimensions, '-')); return (isFinite(scaled) ? scaled : 0.001); }, 'sqrt' : function(n, mode) { if(typeof mode==='undefined') { mode='!'; } var sign=n/Math.abs(n); var root=Math.sqrt(Math.abs(n)); if(sign==-1) { switch(mode) { case 'i^2': case '-': case -1: case 'signed': return sign*root; break; case 'i^4': case '+': case 1: case 'unsigned': case 'abs': return root; break; case 'i-i': case '0': case 0: case 'zero': return 0; break; case 'i': case '!': case false: case 'error': default: if(settings.debugModeInfo && console && console.trace) { console.trace(); } throw "it ain't yer imagination, you tried to root a negative!"; break; } } else { return root; } }, 'cbrt' : function(n) { return Math.cbrt(n); }, 'stack' : function(n) { return (n+1)*(n)/2; }, 'sumArray' : function(VALS) { if(!Array.isArray(VALS)) { VALS=Object.values(VALS); } var sum=0; VALS.forEach(function(val) { sum+=val; }); return sum; }, 'unstack' : function(n) { var sign=n/Math.abs(n); return sign*(setup.ALIAS.sqrt((8*Math.abs(n))+1, '-')-1)/2; }, 'spinTheWheel' : function(ODDS) { var total = 0; var spin = Math.random(); var WHEEL = {}; var wedge = 0; var tick=null; var result = null; var wedge1 = null; Object.keys(ODDS).forEach(function(name) { /* is it a static or dynamic rate? */ wedge=setup.ALIAS.getDynamic(ODDS[name]); if(wedge>0) { total+=parseFloat(wedge*1000); WHEEL[total]=name; if(!wedge1) { wedge1=total; } } }); spin=Math.round(spin*total); result = Object.keys(WHEEL).find(function(ticks) { tick=ticks; return ticks>=spin; }); return WHEEL[(result||wedge1)]; }, 'xp_curve' : function(lv, mod1, rate1, exp, rate2, mod2) { return (( setup.ALIAS.pow(((lv+mod1)*rate1), exp, '-') *rate2)+mod2); }, /* UNIT CONVERSION AND FORMATTING FUNCTIONS */ 'bust_UK' : ['AA','A','B','C','D','DD','E','F','FF','G','GG','H','HH','J','JJ','K','KK','L','LL','M','MM','N','NN','O','OO','P','PP','Q','QQ','R','RR','S','SS','T','TT','U','W','V','VV'], 'degF2C' : function(deg) { return (deg-32)/1.8; }, 'formatAsPct' : function(floatVal, decimalPlaces) { decimalPlaces=decimalPlaces||0; return ((floatVal*100).toLocaleString(undefined, {minimumFractionDigits: decimalPlaces, maximumFractionDigits: decimalPlaces}) +'%'); }, 'formatHeight' : function(ht, units) { units=units||settings.units; return setup.ALIAS.formatLength(ht, units, {'in2ft':12, 'cm2m':1000}); }, 'formatLength' : function(len, units, PARAM) { units=units||settings.units; PARAM=PARAM||{}; PARAM['in2ft']=PARAM['in2ft']||120; PARAM['cm2m' ]=PARAM['cm2m' ]||300; var out = ''; switch(true) { case ("Metric"==settings.units): var cm = len * 2.5; var cm2m = 100; var cm2km = 100*1000; switch(true) { case (cm>cm2km): out = (cm/cm2km).toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1}) +' km'; break; case (cm>PARAM['cm2m' ]): out = (cm/cm2m ).toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1}) +' m'; break; default: out = (cm/ 1).toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1}) +' cm'; break; } break; case ("Imperial"==settings.units): var in2ft = 12; var in2mi = 12*5280; switch(true) { case (len>in2mi): out = (len/in2mi).toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1}) +' mi'; break; case (len>PARAM['in2ft']): out = setup.ALIAS.in2ft(len); break; default: out = (len/ 1).toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1}) +'"'; break; } break; } return out; }, 'formatScale' : function(value, unit, abv) { var scale = 0; var abs = Math.abs(value); var sign = value / abs; var out = ''; if(abs<1) { while(abs<0.001) { scale--; abs *= 1000; } } else { while(abs>1000) { scale++; abs /= 1000; } } switch(true) { case (scale < -6): out='TEENYTINY'; break; case (scale > 6): out='GINORMOUS'; break; case (scale == 6): out=(sign*abs).toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1}) +' '+ (abv ?'E' :('Metric'==settings.units ?'exa' :'quintillion-' ) ) + unit; break; case (scale == 5): out=(sign*abs).toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1}) +' '+ (abv ?'P' :('Metric'==settings.units ?'peta' :'quadrillion-' ) ) + unit; break; case (scale == 4): out=(sign*abs).toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1}) +' '+ (abv ?'T' :('Metric'==settings.units ?'tera' :'trillion-' ) ) + unit; break; case (scale == 3): out=(sign*abs).toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1}) +' '+ (abv ?'G' :('Metric'==settings.units ?'giga' :'billion-' ) ) + unit; break; case (scale == 2): out=(sign*abs).toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1}) +' '+ (abv ?'M' :('Metric'==settings.units ?'mega' :'million-' ) ) + unit; break; case (scale == 1): out=(sign*abs).toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1}) +' '+ (abv ?'k' :('Metric'==settings.units ?'kilo' :'thousand-' ) ) + unit; break; case (scale == 0): out=(sign*abs).toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1}) +' '+ (abv ?'' :('Metric'==settings.units ?'' :'' ) ) + unit; break; case (scale == -1): out=(sign*abs).toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1}) +' '+ (abv ?'m' :('Metric'==settings.units ?'milli' :'thousandth-' ) ) + unit; break; case (scale == -2): out=(sign*abs).toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1}) +' '+ (abv ?'μ' :('Metric'==settings.units ?'micro' :'millionth-' ) ) + unit; break; case (scale == -3): out=(sign*abs).toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1}) +' '+ (abv ?'n' :('Metric'==settings.units ?'nano' :'billionth-' ) ) + unit; break; case (scale == -4): out=(sign*abs).toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1}) +' '+ (abv ?'p' :('Metric'==settings.units ?'pico' :'trillionth-' ) ) + unit; break; case (scale == -5): out=(sign*abs).toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1}) +' '+ (abv ?'f' :('Metric'==settings.units ?'femto' :'quadrillionth-' ) ) + unit; break; case (scale == -6): out=(sign*abs).toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1}) +' '+ (abv ?'a' :('Metric'==settings.units ?'atto' :'quintillionth-' ) ) + unit; break; default: break; } return out; }, 'formatWeight' : function(wt, units, abv) { var sE=setup.ALIAS; units=units||settings.units; if(typeof abv=='undefined') { abv=true; } var out = ''; /* note imperial measure uses US short-tons, not Brittish long-tons (which are ~metric tons) */ switch(true) { case ("Metric"==settings.units): var kg = wt / 2.2; var kg2g = 1000; var kg2t = 1000; switch(true) { case (Math.abs(kg) < 1/kg2g ): out = sE.formatScale(kg*kg2g, (abv ?'g' :'gram'), abv); break; case (Math.abs(kg) > kg2t ): out = sE.formatScale(kg/kg2t, (abv ?'t' :'ton' ), abv); break; default: out = (kg/1).toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1}) +(abv ?' kg':' kilogram'); break; } break; case ("Imperial"==settings.units): var lb2oz = 16; var lb2tn = 2000; switch(true) { case (Math.abs(wt) < 1/lb2oz ): out = sE.formatScale(wt*lb2oz, (abv ?'oz' :'ounce' ), abv); break; case (Math.abs(wt) > lb2tn ): out = sE.formatScale(wt/lb2tn, (abv ?'tn' :'ton' ), abv); break; default: out = (wt/1).toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1}) +(abv ?' lb' : ' pound'); break; } break; } return out; }, 'formatSignificant' : function(value) { var significantDigits = Math.min(Math.max(Math.round(setup.ALIAS.logX(10, 1/Math.abs(value)), '+'), 0), 10); return value.toLocaleString(undefined, {minimumFractionDigits: significantDigits, maximumFractionDigits: significantDigits}); }, 'in2cm' : function(inches) { return inches*2.54; }, 'in2ft' : function(i) { i=Math.round(i); var feet = Math.round( (i-(i % 12))/12 ); var inches = Math.round( i - (feet*12) ); return feet +'''+ inches +'"'; }, 'lbs2kg' : function(pounds) { return pounds/2.2; }, 'prettyDecimal' : function(value, digits) { var sA=setup.ALIAS; digits=digits||3; var PARTS = sA.splitFloat(value.toLocaleString(undefined, {minimumFractionDigits: digits, maximumFractionDigits: digits}), digits); return "<span class='major'>"+ PARTS.major +"</span><span class='minor'>"+ PARTS.point + PARTS.minor +"</span>"; }, 'splitFloat' : function(num) { var sA=setup.ALIAS; var PARTS = sA.regex_capture('^((?:[\\d]+[^\\d]+)*[\\d]+)([^\\d]+)([\\d]+)$', num.toString()); /* sA.WTF(PARTS); */ return { 'major' : PARTS[0], 'point' : PARTS[1], 'minor' : PARTS[2], }; }, 'weightScaled' : function(base, scale) { var bio_scale = setup.ALIAS.pow( 1.50, setup.ALIAS.logX(2, scale, '-') ); var scaled = (base * (setup.ALIAS.pow(bio_scale, 3, '-'))); return (isFinite(scaled) ? scaled : 0.001); }, /* DATE-TIME FUNCTIONS */ 'addDays' : function(d, dateObj) { dateObj=dateObj||$G.PC.STATE.Date; try { dateObj.setDate(dateObj.getDate()+d); } catch (e) {} finally { setup.ALIAS.fixDate(dateObj); } }, 'addHours' : function(h, dateObj) { dateObj=dateObj||$G.PC.STATE.Date; try { dateObj.setHours(dateObj.getHours()+h); } catch (e) {} finally { setup.ALIAS.fixDate(dateObj); } }, 'addMinutes' : function(n, dateObj) { dateObj=dateObj||$G.PC.STATE.Date; try { dateObj.setMinutes(dateObj.getMinutes()+n); } catch (e) {} finally { setup.ALIAS.fixDate(dateObj); } }, 'addMonths' : function(m, dateObj) { dateObj=dateObj||$G.PC.STATE.Date; try { dateObj.setMonth(dateObj.getMonth()+m); } catch (e) {} finally { setup.ALIAS.fixDate(dateObj); } }, 'addSeconds' : function(s, dateObj) { dateObj=dateObj||$G.PC.STATE.Date; try { dateObj.setSeconds(dateObj.getSeconds()+s); } catch (e) {} finally { setup.ALIAS.fixDate(dateObj); } }, 'addWeeks' : function(w, dateObj) { dateObj=dateObj||$G.PC.STATE.Date; try { setup.ALIAS.addDays(w*7, dateObj); } catch (e) {} finally { setup.ALIAS.fixDate(dateObj); } }, 'addYears' : function(y, dateObj) { dateObj=dateObj||$G.PC.STATE.Date; try { dateObj.setYear(dateObj.getYear()+y); } catch (e) {} finally { setup.ALIAS.fixDate(dateObj); } }, 'getDate' : function(dateObj) { dateObj=dateObj||$G.PC.STATE.Date; var mo = dateObj.getMonth()+1; var dt = dateObj.getDate(); return (mo<10 ? '0' : '')+ mo +'/'+ (dt<10 ? '0' : '')+ dt +'/'+ dateObj.getFullYear(); }, 'getDay' : function(dateObj) { dateObj=dateObj||$G.PC.STATE.Date; return ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'][dateObj.getDay()]; }, 'getLongDate' : function(dateObj) { dateObj=dateObj||$G.PC.STATE.Date; return setup.ALIAS.getDay(dateObj) +', '+ setup.ALIAS.getMonth(dateObj) +' '+ dateObj.getDate() +', '+ dateObj.getFullYear(); }, 'getMonth' : function(dateObj) { dateObj=dateObj||$G.PC.STATE.Date; return ['January','February','March','April','May','June','July','August','September','October','November','December'][dateObj.getMonth()]; }, 'getTime' : function(format, dateObj) { dateObj=dateObj||$G.PC.STATE.Date; format=format||'24'; var hours = null; var post = null; var h = null; switch(format) { case '12': h=dateObj.getHours(); post=(h<12 ? ' A.M.' : ' P.M.'); h%=12; hours = (h==0 ? '12' : h.toString()); break; case '24': default: hours=dateObj.getHours().toString().padStart(2,'0'); post=''; break; } return hours +":"+ dateObj.getMinutes().toString().padStart(2,'0') + post; }, 'setTime' : function(h, n, s, dateObj) { dateObj=dateObj||$G.PC.STATE.Date; n=n||0; s=s||0; dateObj.setHours(h, n, s); }, };>>
<<set setup.SYS.TEXT={ /* BASIC STRING FUNCTIONS */ 'CSS_safeID' : function(uid) { return uid.replace(/([^A-Za-z0-9_-]+)/g, '-'); }, /* because ENEMAScript is too FUCKTARDED to split() a string into 2 parts! */ 'kvSplit' : function(delimiter, string, trim) { trim=trim||false; var i = string.indexOf(delimiter); var l = delimiter.length; return (i<0 ? ['', string] : [ (trim ? string.slice(0,i).trim() : string.slice(0,i)), (trim ? string.slice(i+l).trim() : string.slice(i+l)) ] ); }, /* another shortcoming, a lack of non-whitespace trim() support... eg dequote value */ 'trimX' : function(string, trim) { trim=trim||'\\s'; var pattern = new RegExp('^'+trim+'+|'+trim+'+$',"g"); return string.replace(pattern,''); }, 'regex_capture' : function(pattern, subject) { var regex = new RegExp(pattern, 'g'); var MATCHES=regex.exec(subject); /* discard the full pattern match, we only want captures! */ MATCHES.shift(); /* if there is only 1 capture, then return a string, else an array... */ return (MATCHES.length>1 ? MATCHES : MATCHES.shift()); }, /* DESCRIPTIVE FUNCTIONS */ 'a_an' : function(what) { var first_letter = what.charAt(0).toLowerCase(); var next_word=what.toLowerCase(); switch(first_letter) { /* starts with vowel */ case 'a': case 'e': case 'i': case 'o': case 'u': switch(next_word) { /* exceptions */ case 'used': return 'a ' + what; break; /* base rule */ default: return 'an ' + what; break; } break; /* starts with consonant */ default: switch(next_word) { /* exceptions */ case 'hour': return 'an ' + what; break; /* base rule */ default: return 'a ' + what; break; } break; } }, 'descAge' : function(age) { var desc = ''; age = Number(age); switch (true) { case (age>99): return 'very old'; break; case (age>79): desc='old'; break; case (age>59): desc='older'; break; case (age<14): desc='very young'; break; case (age<24): desc='young'; break; case (age<34): desc=''; break; default: /* 34-59 */ desc='middle-aged'; break; } return desc; }, 'descMissing' : function(what) { return "<span class='blank'>[insert '"+ what +"' description here...]</span>"; }, 'estAge' : function(age) { var est = ''; age = Number(age); switch (true) { case (age>99): return "over a hundred"; break; case (age<1.5): return "a baby"; break; case (age<4): return "a toddler"; break; case (age<9): return "a small child"; break; case (age<14): return "a child"; break; case (age<20): return "mid to late teens"; break; } /* force to string */ var DIGITS = age.toLocaleString(undefined, {minimumFractionDigits: 0, maximumFractionDigits: 0}).split(''); switch(true) { case (DIGITS[1]<'3'): est += 'early'; break; case (DIGITS[1]>'6'): est += 'late'; break; default: est += 'mid'; break; } est += ' '+DIGITS[0]+'0s'; return est; }, 'grammar4CHAR' : function(CHAR) { var sE=setup.ALIAS; var g={}; g.isYou = (CHAR.name===$G.PC.name); g.gen = (('she'==sE.he_she(CHAR.TRAITS.gender))?'f':'m'); g.they = (g.isYou ? 'you' : sE.he_she(CHAR.TRAITS.gender)); g.They = (g.isYou ? 'You' : sE.He_She(CHAR.TRAITS.gender)); g.them = (g.isYou ? 'you' : sE.him_her(CHAR.TRAITS.gender)); g.theirs = (g.isYou ? 'you' : sE.his_hers(CHAR.TRAITS.gender)); g.their = (g.isYou ? 'your' : sE.his_her(CHAR.TRAITS.gender)); g.Their = (g.isYou ? 'Your' : sE.His_Her(CHAR.TRAITS.gender)); g.is_are = ( (g.isYou||'they'==g.they) ? 'are' : 'is' ); g.They_are = (g.They+' '+g.is_are); g.they_are = (g.they+' '+g.is_are); g.s_re = ( (g.isYou||'they'==g.they) ? 're' : 's' ); g.They_re = (g.They+'''+g.s_re); g.they_re = (g.they+'''+g.s_re); g.has_have = ( (g.isYou||'they'==g.they) ? 'have' : 'has' ); g.They_have = (g.They+' '+g.has_have); g.they_have = (g.they+' '+g.has_have); return g; }, 'he_she' : function(gender) { var out = ''; switch(gender.toLowerCase()) { case 'female': out = 'she' ; break; case 'futa': out = 'she' ; break; case 'male': out = 'he' ; break; case 'none': out = 'they'; break; default: out = 'they'; break; } return out; }, 'He_She' : function(gender) { var out = ''; switch(gender.toLowerCase()) { case 'female': out = 'She' ; break; case 'futa': out = 'She' ; break; case 'male': out = 'He' ; break; case 'none': out = 'They'; break; default: out = 'They'; break; } return out; }, 'him_her' : function(gender) { var out = ''; switch(gender.toLowerCase()) { case 'female': out = 'her' ; break; case 'futa': out = 'her' ; break; case 'male': out = 'him' ; break; case 'none': out = 'them'; break; default: out = 'them'; break; } return out; }, 'his_her' : function(gender) { var out = ''; switch(gender.toLowerCase()) { case 'female': out = 'her' ; break; case 'futa': out = 'her' ; break; case 'male': out = 'his' ; break; case 'none': out = 'their'; break; default: out = 'their'; break; } return out; }, 'His_Her' : function(gender) { var out = ''; switch(gender.toLowerCase()) { case 'female': out = 'Her' ; break; case 'futa': out = 'Her' ; break; case 'male': out = 'His' ; break; case 'none': out = 'Their'; break; default: out = 'Their'; break; } return out; }, 'his_hers' : function(gender) { var out = ''; switch(gender.toLowerCase()) { case 'female': out = 'hers' ; break; case 'futa': out = 'hers' ; break; case 'male': out = 'his' ; break; case 'none': out = 'theirs'; break; default: out = 'theirs'; break; } return out; }, 'valMissing' : function(what) { return "<span class='blank'>[insert '"+ what +"' metric here...]</span>"; }, };>>
<<set setup.SYS.UI={ /* ARRAY FUNCTIONS */ 'default_params' : function(PARAMS, DEFAULTS) { Object.keys(DEFAULTS).forEach(function(key) { if('undefined'==typeof(PARAMS[key])) { PARAMS[key]=DEFAULTS[key]; } }); }, 'firstKey' : function(KEYS, OBJ) { /* return the first key matched */ var key=null; for(var i=0; i<KEYS.length; i++) { if(OBJ[KEYS[i]]) { key=KEYS[i]; break; } } return key; }, 'firstVal' : function(KEYS, OBJ) { /* return the value of the first key matched */ var key=setup.ALIAS.firstKey(KEYS, OBJ); return OBJ[key] || null; }, 'kvSort' : function(KVLIST, sortBy, sortType, sortDir) { sortBy=sortBy||'val'; sortType=sortType||'numeric'; sortDir=sortDir||'desc'; var SORTED_KEYS=[]; if('val'==sortBy) { if('numeric'==sortType) { if('desc'==sortDir) { SORTED_KEYS = Object.keys(KVLIST).sort(function(a, b) { return KVLIST[b]-KVLIST[a]; }); } else if('asc'==sortDir) { SORTED_KEYS = Object.keys(KVLIST).sort(function(a, b) { return KVLIST[a]-KVLIST[b]; }); } } } return SORTED_KEYS; }, /* WINDOW FUNCTIONS */ 'abFlicker' : function(msg_a, msg_b, rate, freq) { var aware = (($G && $G.PC && $G.PC.MATRIX && $G.PC.MATRIX.aware) ? $G.PC.MATRIX.aware : 1.0); rate=(rate||setup.ALIAS.sqrt(aware, '-'))/1000; freq=freq||1/3; return "<span class='abFlicker' rate='"+ rate +"' freq='"+ freq +"'><span class='a'>"+ msg_a +"</span><span class='b'>"+ msg_b +"</span></span>"; }, 'debugClear' : function() { return; if( settings.debugModeInfo && window.console && window.console.clear) { window.console.clear(); } }, 'debugLog' : function(msg) { if( settings.debugModeInfo && window.console && window.console.log) { window.console.log(msg); } }, 'dialog_hide' : function() { $('#dialog').html(''); $('#dialog').hide(); }, 'dialog_show' : function(dialogName, PARAMS) { if(!setup.DIALOG[dialogName]) { return null; } return setup.ALIAS.dialog_showAs(setup.DIALOG[dialogName]()); }, 'dialog_showAs' : function(dialogText) { /* let us try the native functionality before rolling our own solution... */ Dialog.setup(); Dialog.wiki(dialogText); Dialog.open(); /* $('#dialog').html(''); $('#dialog').wiki("<div class='dialog'>"+ dialogText +"</div>"); $('#dialog').show(); */ }, 'enc_moreDetail' : function(linktext, handler, encounter, PARAMS) { encounter=encounter||_encounter; PARAMS=PARAMS||{}; var attr = (PARAMS['hotkey'] ? " class='optional keypress' key='"+PARAMS['hotkey']+"'" : " class='optional'"); var out = "<p"+attr+"><<linkreplace '"+ linktext +"'>><<print setup.ENCOUNTERS['"+ encounter +"'].CHOICES['"+ handler +"']()>><</linkreplace>></p>"; return out; }, 'enc_showChoices' : function(CHOICES, encounter, PARAMS) { encounter=encounter||_encounter; PARAMS=PARAMS||{}; var uid = PARAMS['choices_id']||'choices-' + Date.now(); var out = "<div id='"+ uid +"'><ul class='choices'>"; var i = 0; Object.keys(CHOICES).forEach(function(opt){ i++; out += "<li class='keypress' key='"+(i)+"'><<link '"+ opt +"'>><<replace '#"+ uid +"'>><<print setup.ENCOUNTERS['"+ encounter +"'].CHOICES['"+ CHOICES[opt] +"']()>><</replace>><</link>></li>"; }); if(PARAMS['cancel']) { out += "<li class='spacer'><br /></li>"; out += "<li class='keypress' key='[ESC]'><<link '< GO BACK'>><<replace '#"+ uid +"'>><<print setup.ENCOUNTERS['"+ encounter +"'].CHOICES['"+ PARAMS['cancel'] +"']()>><</replace>><</link>></li>"; } out += "</ul></div>"; return out; }, 'getFeedback' : function() { var feedback = ''; if(($G.PC.STATE)&&($G.PC.STATE.feedbackQueue)) { feedback = $G.PC.STATE.feedbackQueue.shift(); } return feedback; }, 'giveFeedback' : function(msg) { if(($G.PC.STATE)&&($G.PC.STATE.feedbackQueue)) { $G.PC.STATE.feedbackQueue.push(msg); setup.ALIAS.updateFeedback(); } }, 'updateFeedback' : function() { if($('#feedback').length>0) { $('#feedback').html(''); $('#feedback').wiki($G.PC.STATE.feedbackQueue[0]); } }, 'guideSubtopics' : function(SUBTOPICS) { SUBTOPICS=SUBTOPICS||[]; var LINKS=[]; SUBTOPICS.forEach(function(topic) { LINKS.push(setup.ALIAS.guideTopic(topic)); }); return "<span class='guide-subtopics'>"+ LINKS.join(', ') +"</span>"; }, 'guideTopic' : function(topic) { return "<<link '"+ topic +"'>><<set _topic='"+ topic +"'; setup.ALIAS.menuShow('guide'); >><</link>>"; }, 'hideSideBar' : function() { $('#sidebar').hide(200); $('#datetime').hide(200); $('#feedback').hide(200); }, 'menuHide' : function() { $('#menu').html(''); $('#menu').hide(); }, 'menuList' : function(LIST, lnk, wrap, cls, ATTR) { cls=cls||''; ATTR=ATTR||{}; var out=''; Object.keys(LIST).forEach(function(li) { if(LIST[li].show()) { if(LIST[li].key) { ATTR['key']=LIST[li].key; } if(LIST[li][lnk]) { out += setup.ALIAS.wrap("<<link '"+ LIST[li][lnk] +"'>><<run setup.ALIAS.menuShow('"+ li +"'); >><</link>>", wrap, cls, ATTR); } } }); return out; }, 'menuList_icons' : function(LIST, wrap, cls, ATTR) { LIST=LIST||setup.MENU; wrap=wrap||'img'; cls=cls||'keypress'; ATTR=ATTR||{}; return setup.ALIAS.menuList(LIST, 'icon' , wrap, cls, ATTR ); }, 'menuList_long' : function(LIST, wrap, cls, ATTR) { LIST=LIST||setup.MENU; wrap=wrap||'p'; cls=cls||'narrow keypress'; ATTR=ATTR||{}; return setup.ALIAS.menuList(LIST, 'long' , wrap, cls, ATTR ); }, 'menuList_short' : function(LIST, wrap, cls, ATTR) { LIST=LIST||setup.MENU; wrap=wrap||'li'; cls=cls||'keypress'; ATTR=ATTR||{}; return setup.ALIAS.menuList(LIST, 'short', wrap, cls, ATTR ); }, 'menuShow' : function(menu) { return setup.ALIAS.menu_showAs(setup.MENU[menu].passage); }, 'menu_showAs' : function(passage) { $('#menu').html(''); $('#menu').wiki(Story.get(passage).processText()); $('#menu').show(); }, 'powerMeter' : function(power, max, segments) { var out='<powermeter>'; var rem=0; var graph_limit = segments || settings.perf_graphSegments || 20; var s_max = (max>graph_limit ? graph_limit : max ); var s_power = power * (s_max/max); var s_unit = (power / s_power).toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1}); var scaled = (max>graph_limit); for(var i=0; i<s_max; i++) { rem=Math.min(1, s_max-i); out+="<seg v='"; switch(true) { case (i+(0.1*rem)>=s_power): out+='0'; break; case (s_power>=i+(0.85*rem)): out+='1'; break; default: out+=(s_power-i).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}); break; } if(i+0.5>s_max) { out+="' style='opacity: 0.5;"; } out+="'>"+(scaled ? s_unit : '')+"</seg>"; } out+='</powermeter>'; return out; }, 'refresh_detail' : function() { if($G.PC.STATE.detail) { $('#detail').html(''); $('#detail').wiki(Story.get($G.PC.STATE.detail).processText()); } }, 'reloadPassage' : function() { return "<<replace '#passages'>><<include '"+ State.passage +"'>><</replace>>"; }, 'run_abFlicker' : function() { return "<script> setTimeout(function() { $('.abFlicker').each(function() { var abfSpan = $(this); abfSpan.children('.b').hide(); setInterval(function() { if(Math.random()< (1-abfSpan.attr('rate'))) { abfSpan.children('.a').show(); abfSpan.children('.b').hide(); } else { abfSpan.children('.a').hide(); abfSpan.children('.b').show(); } }, Math.ceil(1000/abfSpan.attr('freq')) ); }); }, 50); </script>"; }, 'showSideBar' : function() { $('#sidebar').show(200); $('#datetime').show(200); $('#feedback').show(200); }, 'system_getDataSize' : function() { return JSON.stringify($G).length; }, 'system_onLoad' : function() { var sE = setup.ALIAS; /* settings.debugModeInfo=false; */ sE.giveFeedback('gamesave loaded: ' + sE.system_getDataSize().toLocaleString() + ' bytes.'); }, 'system_onSave' : function() { }, 'trim_combatLog' : function() { var cutoff=settings.perf_combatLog||30; $('#combat_log .btl_evt:nth-of-type(n+'+ cutoff +')').remove(); }, 'wrap' : function(contents, wrap, cls, ATTR) { cls=cls||''; ATTR=ATTR||{}; var attr = ''; Object.keys(ATTR).forEach(function(a) { attr += ' '+ a +"='"+ ATTR[a] +"'"; }); var out=''; switch(wrap) { case 'img': out += "<img src='"+ contents +"' "+ attr +" />"; break; default: out += "<"+ wrap +(cls ? " class='"+ cls +"'" : '') +" "+ attr +">"+ contents +"</"+ wrap +">"; break; } return out; }, 'WTF' : function(WTF_DATA, popAlert) { var wtfo = JSON.stringify(WTF_DATA); setup.ALIAS.debugClear(); setup.ALIAS.debugLog(wtfo+'\n\n'); if(popAlert) { alert(wtfo); } }, };>>
<<set setup.SYS.MAIN={ /* GAME ENGINE -- everything below this point */ 'engineVersion' : 0.26682, 'contentVersion' : 0.43964, 'gameVersion' : function(style) { var sX=setup.ALIAS; var out = ''; switch(style) { case 'full': out = 'engine v. '+sX.engineVersion+' | content v. '+sX.contentVersion; break; default: out = ((sX.engineVersion+sX.contentVersion)/2).toFixed(5); break; } return out; }, 'buildVersion' : "public", 'contentSite' : "?", 'modVersion' : "?", 'versionUpdate' : function() { var sX=setup.ALIAS; /* TODO: complete refactor the update code to split CHARACTER updates from WORLD updates... make CHAR updates run ON DEMAND to convert NPCs and PCs alike (with unified data structure) */ /* save-location refactor */ if($GAMEDATA) { $G=$GAMEDATA; delete $GAMEDATA; } if(!$G.WORLD) { $G.WORLD={}; } var PC = $G.PC; var WORLD = $G.WORLD; /* ensure all base-nodes are present */ sX.hlObj_addRootNodes(PC); var out_of_date=false; var compatibility_threshold=0.258; var incompatible=(PC.STATE.saveVersion<compatibility_threshold); if(incompatible) { sX.giveFeedback("<div class='flashing big-red'>WARNING: this save-data is <u>Not Compatible</u> with the current engine, attempting to use this data may cause unexpected behavior!</div>"); return false; } /* shift gamestate data to characters before running additional tests */ if(!PC.STATE && $G.STATE) { PC.STATE = $G.STATE; $G.STATE = null; } if(!PC.STATE.saveVersion && PC.STATE.gameVersion) { PC.STATE.saveVersion = PC.STATE.gameVersion; PC.STATE.gameVersion = null; } if(!PC.STATE.saveVersion){ PC.STATE.saveVersion = 0.10; } if( PC.STATE.saveVersion<sX.engineVersion ){ if(PC.STATE.saveVersion<0.3) { if(!PC.TRAITS.gender) { out_of_date=true; PC.TRAITS.gender = 'female'; } if(!PC.TRAITS.species) { out_of_date=true; PC.TRAITS.species = 'human'; } if(!PC.NAMES.full) { out_of_date=true; PC.NAMES.full = sX.getName(['online','birth','first'], '?', PC); } if(!PC.actor) { out_of_date=true; PC.actor ='player'; } if(!PC.name) { out_of_date=true; PC.name =PC.NAMES.full; } if(!PC.name_first) { out_of_date=true; PC.name_first =PC.NAMES.first; } if(!PC.SLAVES) { out_of_date=true; PC.SLAVES ={}; } if(!PC.EXSLAVES) { out_of_date=true; PC.EXSLAVES ={}; } if(!PC.ENEMIES) { out_of_date=true; PC.ENEMIES ={}; } if(!PC.FRIENDS) { out_of_date=true; PC.FRIENDS ={}; } if(!PC.LOVERS) { out_of_date=true; PC.LOVERS ={}; } /* remove outdated status conditions */ PC.STATUS = {}; /* split light from dark */ if(PC.MATRIX.karma) { out_of_date=true; PC.MATRIX.light = PC.MATRIX.karma/2; PC.MATRIX.dark = PC.MATRIX.karma/2; delete $G.PC.MATRIX.karma; } if(!PC.POWERS) { out_of_date=true; PC.POWERS={}; } if(!PC.SKILLS) { out_of_date=true; PC.SKILLS={}; } if(!PC.DEVICES) { out_of_date=true; PC.DEVICES={}; } if(!PC.BODY) { out_of_date=true; PC.BODY=sX.new_BODY(1,1); } if(!PC.LIMBS) { out_of_date=true; PC.LIMBS={}; sX.regenerateBody(0.0001, 0.0001, PC); } if(!$G.ERRORS) { $G.ERRORS={ 'NaN':{}, }; } if(!PC.R.S) { out_of_date=true; PC.R.S={}; /* R.S */ } if(!PC.PASSAGES.travel) { out_of_date=true; PC.PASSAGES.travel='DRIVE SOMEWHERE'; } if(PC.WORLD) { out_of_date=true; WORLD=PC.WORLD; PC.WORLD=null; } if(!WORLD.girlPower) { out_of_date=true; WORLD.girlPower=1; } if(!WORLD.amazonIndex) { out_of_date=true; WORLD.amazonIndex=$G.WORLD.girlPower/10; } if(!WORLD.NPCS) { out_of_date=true; WORLD.NPCS={}; } if(!WORLD.PLACES) { out_of_date=true; WORLD.PLACES={}; } if(!PC.PLACES) { out_of_date=true; PC.PLACES={}; } if(!PC.STATE.WEATHER) { out_of_date=true; PC.STATE.WEATHER={}; } if(!WORLD.VARS) { out_of_date=true; WORLD.VARS={}; } if(!WORLD.VARS['game.difficulty.level']) { out_of_date=true; WORLD.VARS['game.difficulty.level']=1.0; } if(!WORLD.RATES) { out_of_date=true; WORLD.RATES={}; } if(!WORLD.RATES.breastExpansion ) { out_of_date=true; WORLD.RATES.breastExpansion =0; } if(!WORLD.RATES.heightGain ) { out_of_date=true; WORLD.RATES.heightGain =0; } if(PC.STATS) { var BASE_STATS=['STR','PHY','WSD','END','SPD','INS']; var stat_base = 1; var stat_total = 0; var pow = 0; var W = 0; var K = 0; BASE_STATS.forEach(function(stat) { if(!PC.S[stat]) { out_of_date=true; PC.S[stat]={}; } stat_base = PC.STATS[stat]; pow = ((PC.POWERS && PC.POWERS['x'+stat]) ? PC.POWERS['x'+stat].rank : 0); if(!PC.S[stat]['base'] ) { out_of_date=true; PC.S[stat]['base'] = stat_base; /* developed very slowly by numerous means, including ALL of the below */ } if(!PC.S[stat]['pow'] ) { out_of_date=true; PC.S[stat]['pow'] = pow; /* super-stat power rank */ } if(!PC.S[stat]['mult'] ) { out_of_date=true; PC.S[stat]['mult'] = 1.0; /* super-stat power rank */ } if(!PC.S[stat]['PERM'] ) { out_of_date=true; PC.S[stat]['PERM'] = {}; /* permanent modifiers/augments */ } if(!PC.S[stat]['PERM']['drain'] ) { out_of_date=true; PC.S[stat]['PERM']['drain'] = 0; /* stolen from others */ } if(!PC.S[stat]['PERM']['evolve']) { out_of_date=true; PC.S[stat]['PERM']['evolve'] = 0; /* adaptation, mutation, Val gift */ } if(!PC.S[stat]['PERM']['genes'] ) { out_of_date=true; PC.S[stat]['PERM']['genes'] = 0; /* covers genetic engineering and lottery */ } if(!PC.S[stat]['PERM']['karma'] ) { out_of_date=true; PC.S[stat]['PERM']['karma'] = 0; /* bought with deeds */ } if(!PC.S[stat]['PERM']['primal']) { out_of_date=true; PC.S[stat]['PERM']['primal'] = 0; /* repeated exposure to raw primal energy */ } if(!PC.S[stat]['PERM']['train'] ) { out_of_date=true; PC.S[stat]['PERM']['train'] = 0; /* gained through sweat */ } if(!PC.S[stat]['PERM']['health']) { out_of_date=true; PC.S[stat]['PERM']['health'] = 0; /* based on nutrition/intake/wellness */ } if(!PC.S[stat]['PERM']['energy']) { out_of_date=true; PC.S[stat]['PERM']['energy'] = 0; /* elemental energy/material-bonds */ } if(!PC.S[stat]['TEMP'] ) { out_of_date=true; PC.S[stat]['TEMP'] = {}; /* permanent modifiers/buffs */ } if(!PC.S[stat]['~cache']) { out_of_date=true; PC.S[stat]['~cache'] = stat_base*(1.1**pow); } switch(stat) { case 'STR': case 'WSD': case 'SPD': W+=stat_base; break; case 'PHY': case 'END': case 'INS': K+=stat_base; break; } stat_total+=stat_base; }); if(!PC.S.CALC) { out_of_date=true; PC.S.CALC={}; } delete PC.STATS; } sX.statRefresh(PC); /* new, compound weight system - WiP, do not enable */ if(!PC.M.WEIGHT) { out_of_date=true; var wtMod = 0; switch(PC.NAMES.full) { case 'Cindy Phoenix': wtMod = 32.8; break; case 'Tammi X': wtMod = - 21.6; break; case 'Susan G Marien': wtMod = - 23.6; break; case 'Lt. Lisa Victoria Irons III': wtMod = -195.2; break; default: break; } sX.weightConvert(PC, wtMod); } /* additional new-format metrics */ ['HEIGHT','BICEP','FOREARM','QUADS','CALF','CHEST','WAIST','HIPS','PECS','TITS','ASS'].forEach(function(key) { if(!PC.M[key]) { PC.M[key] = { 'PERM' : { 'tone' : 0, 'racegen' : 0, 'wt' : 0, 'stat' : 0, 'oil' : 0, 'flex' : ((key==='HEIGHT'||key==='WAIST'||key==='HIPS') ?null :0), 'pump' : ((key==='HEIGHT'||key==='WAIST'||key==='HIPS') ?null :0), }, 'TEMP' : {}, 'STR' : {}, 'base' : 0, 'min' : 0, '~cache' : 0, }; } }); if(!PC.M.WAIST.PERM.stress ) { PC.M.WAIST.PERM.stress=0; } if(!PC.M.WAIST.PERM.starve ) { PC.M.WAIST.PERM.starve=0; } if(!PC.M.TITS.PERM.lactation ) { PC.M.TITS.PERM.lactation=0; } } /* disregard the test below, only run this one fucking time... at least until fully debugged from looping */ out_of_date=false; /* wait until all upgrade tests pass before updating version number... */ /* this way, if it requires player choice, like creed, it will keep prompting until a selection is made */ if(!!incompatible && !out_of_date) { PC.STATE.saveVersion = sX.engineVersion; return true; } } }, 'addItem' : function(item_id, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('addItem - NO CHAR!'); } /* Items are now directly referenced from the database, so all we need is the charge count */ if(!CHAR.STUFF[item_id]) { CHAR.STUFF[item_id]=0; } CHAR.STUFF[item_id]+=sX.getItem(item_id).uses; return true; }, 'after_update' : function(CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('after_update - NO CHAR!'); } if($G.PC.dead) { $('#passages').wiki("<<goto 'GAME OVER'>>"); } }, 'afterPassage' : function(encounter, passage) { passage=passage||State.passage; encounter=encounter||_encounter; if(typeof setup.ENCOUNTERS[encounter].afterPassage === 'function') { return setup.ENCOUNTERS[encounter].afterPassage(); } }, 'after_use' : function(item_id, qty, CHAR) {}, 'athletics_calc' : function(feat, CHAR, PARAMS) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('brokeTime - NO CHAR!'); } var est=0; switch(feat) { case "lift": /* ((muscle.mass+muscle.condition+STR+PHY+[%SPD]) x [vigor+%power]/100 x condition/potential) = lift */ /* power for fast-twitch, vigor for slow twitch, -- exercises will use 0-100% of each, */ /* calculate muscle percentages for given lift */ /* power/vigor scales by fullness... min=10%; max=100%*Mag; amt>100% needs to be a scaled bonus (eg 1.1^[(amt/max/100)-1]) */ /* add muscle.condition to muscle.mass for lift power (scales with level) */ break; } return est; }, 'azIScaleStats' : function(gender, S, PARAMS) { var sX=setup.ALIAS; PARAMS=PARAMS||{}; var NEW_S = Object.assign({}, S); var BASE = PARAMS['BASE']||{ 'STR':0, 'PHY':0, 'WSD':0, 'END':0, 'SPD':0, 'INS':0 }; var amazonIndex = PARAMS['amazonIndex'] || $G.WORLD.amazonIndex; var azI_root = sX.sqrt(amazonIndex, '+'); var azI_avg = (amazonIndex+azI_root)/2; switch(true) { case (gender=='female'): case (gender=='futa'): NEW_S.STR.base = BASE.STR+(S.STR.base/3*azI_root)+amazonIndex; NEW_S.PHY.base = BASE.PHY+(S.PHY.base/3*azI_root)+azI_avg; NEW_S.WSD.base = BASE.WSD+(S.WSD.base/3*azI_root)+azI_root; NEW_S.END.base = BASE.END+(S.END.base/3*azI_root)+azI_avg; NEW_S.SPD.base = BASE.SPD+(S.SPD.base/3*azI_root)+azI_avg; NEW_S.INS.base = BASE.INS+(S.INS.base/3*azI_root)+azI_root; break; case (gender=='male'): case (gender=='none'): default: break; } return NEW_S; }, 'beforePassage' : function(encounter, passage) { passage=passage||State.passage; encounter=encounter||_encounter; if(typeof setup.ENCOUNTERS[encounter].beforePassage === 'function') { return setup.ENCOUNTERS[encounter].beforePassage(); } }, 'before_update' : function(CHAR) {}, 'before_use' : function(item_id, qty, CHAR) {}, 'brokeTime' : function(CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('brokeTime - NO CHAR!'); } if(CHAR.R.S.chrono) { CHAR.R.S.chrono++; } else { CHAR.R.S.chrono=1; } if(CHAR.Y.brokeTime) { CHAR.Y.brokeTime++; } else { CHAR.Y.brokeTime=1; } }, 'buyItem' : function(item_id, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('buyItem - NO CHAR!'); } $G.PC.STATE.lastAction = 'buy'; var ITEM = sX.getItem(item_id); var success=null; if(parseFloat(CHAR.MATRIX.money.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}))<ITEM.cost) { sX.giveFeedback('you don't have enough money to buy this!'); success=false; } else { CHAR.MATRIX.money-=sX.sale_price(ITEM.cost, sX.check_sale(item_id)); sX.giveFeedback('You bought [' + ITEM.name + '], which leaves you with $ ' + (CHAR.MATRIX.money).toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2})); success=true; } if(success) { sX.addItem(item_id, CHAR); } sX.do_status_update(CHAR); return success; }, 'calcBodyMass' : function(CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('calcBodyMass - NO CHAR!'); } /* sX.statGet(stat, secAlias, CHAR); */ var S = sX.statGet('all', 'base', CHAR); var E = CHAR.MATRIX; var wt = sX.weightGet('base', CHAR); var bwt = sX.weightGet('scaled', CHAR); /* simulates rougly 0.5% creatine by bodyweight for an average person, reducing oxygen/calorie needs - efficiency caps at (wt/10+lv)/cal # min bodymass */ var creatine_reserve = Math.max(-S.capacity*3, (sX.sqrt( (E.vigor*S.capacity)-(E.metab/S.capacity),'-' )) ); var scaled_mass = Math.min(bwt*3, ((bwt/(S.PHY/10))-creatine_reserve) ); var min_mass = ((wt/(S.PHY/10)) + S.level)/S.capacity; /* sX.WTF({ 'creatine_reserve' : creatine_reserve, 'scaled_mass' : scaled_mass, 'min_mass' : min_mass, 'bwt' : bwt, 'base wt' : wt, }, true); */ return Math.max( min_mass, scaled_mass); }, 'calcReps' : function(workout, weight, CHAR) { var sX=setup.ALIAS; var sW=setup.WORKOUTS; if(!CHAR) { sX.debugLog('calcReps - NO CHAR!'); } workout=workout||_workout; weight=weight||_weight; /* sX.statGet(stat, secAlias, CHAR); */ var S = sX.statGet('all', 'current', CHAR); var SS = sX.statGet('all', 'mult', CHAR); var bwt = sX.weightGet('body', CHAR)*0.99; var mus = sX.weightGet('muscle', CHAR); var hbw = ((bwt-(mus*3)) * sW[workout].pbw); var liftpower = (SS.STR)*(Math.min(CHAR.MATRIX.power, (S.STR * S.SPD)) + mus-hbw) * sW[workout].pls; var lift_pct = (liftpower/weight); var reps = (SS.PHY)*(lift_pct>1 ? ((lift_pct-0.97)*30) : lift_pct); var rand = sX.rand(0.25, 1.75)+0.34; reps *= rand; return reps; }, 'canDo' : function(action_type, activity, hours, level, CHAR) { var sX=setup.ALIAS; var sA = setup.ACTIONS; var E = CHAR.MATRIX; if(!CHAR) { sX.debugLog('canDo - NO CHAR!'); } action_type=action_type.toUpperCase(); var ACT_MATRIX = sA[action_type][activity].MATRIX; hours=hours||sA[action_type][activity].hours; level=level||1.0; var effort = hours*level; var can = true; switch(true) { case (CHAR.dead): can = false; /* ... */ break; case (action_type=='REST'): can = true; /* you can ALWAYS rest, no matter what condition you are in... */ break; default: if(CHAR.stun || CHAR.ko || CHAR.dead) { can = false; break; } if((E.vigor<0)||(E.qi<0)||CHAR.stun||CHAR.KO||CHAR.dead) { can = false; } Object.keys(ACT_MATRIX).forEach(function(resource) { if(typeof E[resource] === 'undefined') { E[resource]=0; } if(ACT_MATRIX[resource]<0) { switch(resource) { /* ignore these: */ case 'kcal': case 'protein': case 'sugar': break; case 'karma': if(sX.getTotalKarma(CHAR) < (-ACT_MATRIX[resource] *effort)) { can = false; } break; default: if((E[resource]+sX.maxResource(resource, CHAR)) < (-ACT_MATRIX[resource] *effort)) { can = false; } break; } } }); break; } if(typeof sA[action_type][activity].canDo=='function') { /* passthrough filter, can override */ can = sA[action_type][activity].canDo(can); } return can; }, 'canDoLift' : function(workout, CHAR, autoAbort) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('canDoLift - NO CHAR!'); } var RESULT = { 'canDo' : true, 'reason' : '', 'REGIONS' : {}, 'TYPES' : {}, }; var partCondition = 0; var pType = ''; /* sX.statGet(stat, secAlias, CHAR); */ var S = sX.statGet('all', 'current', CHAR); var B = CHAR.BODY; /* TODO: add limb-condition/strength calculation as % lift max to this loop... */ Object.keys(setup.WORKOUTS[workout].MATRIX).forEach(function(part) { partCondition = (B[part].train * S.capacity) - (B[part].damage*S.difficulty_level) - (B[part].fatigue*S.difficulty_level); if(partCondition<=0) { RESULT.canDo = false; RESULT.REGIONS[part]=part; pType=setup.BODY[part].type; RESULT.TYPES[pType]=pType; /* do we want to quit at first sign of failure, or list all failings...? */ if(autoAbort) { return false; } } }); RESULT.reason = (Object.keys(RESULT.TYPES).join('/')) +" damage/fatigue to "+ (Object.keys(RESULT.REGIONS).join(', ')); return RESULT; }, 'carOrCab' : function(CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('carOrCab - NO CHAR!'); } /* STOP FUCKING PARSING THIS AS A FUCKING AUTO-LINK AND CREATING BULLSHIT PASSAGES WITH GARBLED NAMES, YOU STUPID FUCKING TWINE IDE!!! */ return '['+'['+ ( CHAR.PASSAGES.travel || 'WALK SOMEWHERE' ) +']'+']'; }, 'causeOfDeath' : function(CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('causeOfDeath - NO CHAR!'); } return (CHAR.CoD ? CHAR.CoD : 'cause of death unknown'); }, 'cdb_parseCompressedObject' : function(compressedObjectText, INFLATED, PARAMS) { var sX=setup.ALIAS; INFLATED=INFLATED||{}; var ITEM=[]; var KEYS=[]; var VALS=[]; var CONVALS=[]; var VAL_OPS=[]; var CON_OPS=[]; var OPERATION=[]; var ops_pattern = /\s*(\!?[<>=+*^%\/\\~&-]+)?\s*(-?#?[\w«» .]+)\s*([d$^%@\/\\~&])?\s*(-?#?[\w«» .]+)?\s*/g; var oldVal = null; /* sX.WTF({ 'Original Text':compressedObjectText, 'INFLATED':INFLATED, 'PARAMS':PARAMS, }); */ switch(compressedObjectText) { case '-': case '': return INFLATED; break; } compressedObjectText = sX.cdb_parseTextField(compressedObjectText, PARAMS); /* sX.WTF({ 'param-replaced text' : compressedObjectText, }); */ compressedObjectText.split(';').forEach(function(kvString) { kvString=kvString.trim(); if(''===kvString) { return; } ITEM=sX.kvSplit(':', kvString, true); KEYS=ITEM[0].split('|'); VALS=ITEM[1].split('|'); VALS.forEach(function(val) { CONVALS=sX.kvSplit(':', val, true); /* VAL_OPS are on the right of the : and always present */ VAL_OPS=CONVALS.pop().split(','); /* CON_OPS are on the left of the :, if present */ CON_OPS=CONVALS.pop(); if(CON_OPS) { CON_OPS=CON_OPS.split(','); } if(!CON_OPS || sX.cdb_parseConditionals(CON_OPS, INFLATED, PARAMS)) { VAL_OPS.forEach(function(operation) { operation=operation.trim(); OPERATION=ops_pattern.exec(operation); ops_pattern.lastIndex=0; KEYS.forEach(function(key) { if(key==='*') { Object.keys(INFLATED).forEach(function(entry) { oldVal = (INFLATED[entry]||0); INFLATED[entry]=sX.cdb_parseValueOperations(OPERATION, oldVal, INFLATED); /* sX.debugLog(oldVal +' & '+ operation +' = '+ INFLATED[entry]); */ }); } else { oldVal = (INFLATED[key]||0); INFLATED[key]=sX.cdb_parseValueOperations(OPERATION, oldVal, INFLATED); /* sX.debugLog(oldVal +' & '+ operation +' = '+ INFLATED[key]); */ } }); /* END KEYS LOOP */ }); /* END VAL_OPS LOOP */ } else { /* CONDITIONS FAILED FOR THIS OPERATION... */ } }); /* END VALS LOOP */ }); /* END compressedObjectText(;) LOOP */ /* sX.WTF({ 'INFLATED-FINAL' : INFLATED, }); */ return INFLATED; }, 'cdb_parseConditionals' : function(CONDITIONALS, INFLATED, PARAMS) { var sX=setup.ALIAS; /* include conditional key tests */ /* sX.WTF({ 'CONDITIONALS' : CONDITIONALS, }); */ var pattern = /\s*([\w«»~ .]+)\s*([!])?([<>=]+)\s*(-?#?[\w«» .$-]+)\s*(~)?\s*(-?#?[\w«» .$-]+)?\s*/g; var SEGMENTS=[]; var result = true; var finalResult = true; var test = null; var neg = null; var op1 = null; var val1 = null; var sign1=''; var op2 = null; var val2 = null; var sign2=''; /* NOTE: may have to add type-casting for comparisons */ CONDITIONALS.forEach(function(condition) { if(finalResult) { /* ES6 too stupid to return/break inside forEach... so skip execution after first fail... */ condition=condition.trim(); /* split the pattern and reset the cursor! */ SEGMENTS=pattern.exec(condition); pattern.lastIndex=0; test = (SEGMENTS[1]||'').trim(); neg = '!'=== (SEGMENTS[2]||'').trim(); op1 = (SEGMENTS[3]||'').trim(); val1 = (SEGMENTS[4]||'').trim(); op2 = (SEGMENTS[5]||'').trim(); val2 = (SEGMENTS[6]||'').trim(); if(val1.slice(-1)==='-') { sign1='-'; val1=val1.slice(1); } if(val2.slice(-1)==='-') { sign2='-'; val2=val2.slice(1); } if(val1.slice(0, 1)==='#') { val1=INFLATED[val1.slice(1)]; } if(val2.slice(0, 1)==='#') { val2=INFLATED[val2.slice(1)]; } /* NOTE: sign here in CONDITIONALS is STRING, not numeric, to maintain string comparison support */ val1=sign1+val1; val2=sign2+val2; switch(op1) { case '=': if(('~'===op2) && val2) { result = ((PARAMS[test]>=Math.min(val1, val2)) && (PARAMS[test]<=Math.max(val1, val2))); } else { result = PARAMS[test]==val1; } break; case '>': result = PARAMS[test]>val1; break; case '>=': result = PARAMS[test]>=val1; break; case '<': result = PARAMS[test]<val1; break; case '<=': result = PARAMS[test]<=val1; break; default: break; } result = (neg ? !result : result); /* sX.debugLog("test condition: '"+ condition +"' ..."+(result ?'passed' :'failed')+'.'); */ finalResult = (finalResult && result); } }); return finalResult; }, 'cdb_parseTextField' : function(field, PARAMS) { var varExp = null; var parsed = field; Object.keys(PARAMS).forEach(function(key) { /* more js-stupidity... cannot multi-replace simple strings... */ varExp = new RegExp('«'+key+'»', 'g'); parsed = parsed.replace(varExp, PARAMS[key]); }); return parsed; }, 'cdb_parseValueOperations' : function(SEGMENTS, oldValue, INFLATED, PARAMS) { var sX=setup.ALIAS; /* SYNTAX: [groupStart]? [operator1]? [operand1] [operator2]? [operand2]? [groupEnd]? */ /* {x}|2[x]|(x)|'x'|"x"|`x`|2<x>|«x» [=+-*\/^%~] [#float(«VarName»|'string')] [~$d+-*\/^%<>!=(==|!=|>=|<=)] [#float(«VarName»|'string')] {x}|2[x]|(x)|'x'|"x"|`x`|2<x>|«x» */ /* remember to trim() both sides, in case outer spaces were grabbed... */ var operator1=(SEGMENTS[1]||'').trim()||'='; var operand1=(SEGMENTS[2]||'').trim(); var operator2=(SEGMENTS[3]||'').trim(); var operand2=(SEGMENTS[4]||'').trim(); var result1=0; var sign1=1; var result2=0; var sign2=1; /* prep operand1 - detect sign and variables, convert to float if numeric, else keep string... */ if(operand1.slice(0, 1)==='-') { sign1=-1; operand1=operand1.slice(1); } if(operand1.slice(0, 1)==='#') { operand1=INFLATED[operand1.slice(1)]; } operand1=(sign1*parseFloat(operand1)||operand1); /* prep operand2 - detect sign and variables, convert to float if numeric, else keep string... */ if(operand2.slice(0, 1)==='-') { sign2=-1; operand2=operand2.slice(1); } if(operand2.slice(0, 1)==='#') { operand2=INFLATED[operand2.slice(1)]; } operand2=(sign2*parseFloat(operand2)||operand2); if(operator2 && operand2) { switch(operator2) { case '&': result2 = ''.concat( operand1 , operand2 ); break; case '+': result2 = operand1 + operand2; break; case '-': result2 = operand1 - operand2; break; case '*': result2 = operand1 * operand2; break; case '/': result2 = operand1 / operand2; break; case '%': result2 = operand1 % operand2; break; case '\\': result2 = Math.floor( operand1 / operand2); break; case '@': result2 = sX.rng_chances( operand1 , operand2); break; case 'd': result2 = sX.rng_dice( operand1 , operand2); break; case '~': result2 = sX.rng_range( operand1 , operand2); break; case '$': result2 = sX.rng_stdev( operand1 , operand2); break; case '^': result2 = sX.pow( operand1 , operand2, '-'); break; default: break; } /* sX.debugLog('operation: '+ operand1 +' '+ operator2 +' '+ operand2 +' = '+ result2); */ } else if(operator2) { switch(operator2) { case '%': result2 = operand1/100; break; default: break; } } else { result2 = operand1; } if(operator1.slice(-1)==='-') { result2*=-1; } switch(operator1) { case '=': case '=-': result1 = result2; break; case '&': result1 = ''.concat( oldValue , result2); break; case '+': case '+-': result1 = oldValue + result2; break; case '-': case '--': result1 = oldValue - result2; break; case '*': case '*-': result1 = oldValue * result2; break; case '/': case '/-': result1 = oldValue / result2; break; case '%': case '%-': result1 = oldValue % result2; break; case '\\': case '\\-': result1 = Math.floor( oldValue / result2); break; case '~': result1 = oldValue + sX.rng_range(-result2, result2); break; case '~-': result1 = oldValue - sX.rng_range(-result2, result2); break; case '^': case '^-': result1 = sX.pow( oldValue , result2, '-'); break; case '!<': case '!<-': result1 = Math.max( oldValue , result2); break; case '!>': case '!>-': result1 = Math.min( oldValue , result2); break; default: break; } /* sX.debugLog('operation: '+ oldValue +' '+ operator1 +' '+ result2 +' = '+ result1); */ return result1; }, 'chamber_refreshObjects' : function(chamberID) { /* enumerate through all ENTITIES, ITEMS, SITUATIONS, and other OBJECTS and update the list of contents for that room */ }, 'charTempVar' : function(CHAR, tVar, setVal) { CHAR.TEMP=CHAR.TEMP||{}; if(typeof setVal == 'undefined') { /* get temp */ return CHAR.TEMP[tVar]; } else { /* set temp and return value for javascript object flow-through chaining */ return CHAR.TEMP[tVar]=setVal; } }, 'char_appearance' : function(CHAR) { var sX=setup.ALIAS; var g=sX.grammar4CHAR(CHAR); var out = ''; State.setVar( '_OOGLE', CHAR ); var descBack = sX.desc('back', CHAR); var descShoulders = sX.desc('shoulders', CHAR); var descBackAndShoulders = descBack+' back and'+(descBack==descShoulders ? '' : ' '+descShoulders)+' shoulders'; out += sX.wrap( g.They_are+' '+sX.desc('height', CHAR)+', roughly '+sX.val('height', CHAR) +', and '+sX.desc('weight', CHAR)+', somewhere around '+sX.val('weight', CHAR) +(g.isYou?' when last you checked':'')+'. ' +g.They_re+' '+sX.desc('bodytone', CHAR)+', with '+sX.val('bodyfat', CHAR)+'% body-fat.' , 'p', 'wide'); out += sX.wrap( g.They_have+' '+ ('f'==g.gen?(sX.desc('bust', CHAR)+' '+sX.val('cup', CHAR)+'-cup breasts and '):'')+sX.a_an(sX.desc('chest', CHAR)) +' chest, with '+sX.desc('pecs', CHAR)+' pecs, measuring '+sX.val('pecs', CHAR)+' deep' +', and a wingspan of '+sX.val('chest', CHAR)+' across '+g.their+' '+sX.desc('lats', CHAR)+' lats' +', which tapers to '+sX.a_an(sX.desc('waist', CHAR))+' '+sX.val('waist', CHAR)+' waist with '+sX.desc('abs', CHAR) +' '+(('f'==g.gen)?('which curves out to '+sX.desc('hips', CHAR)):'')+' '+sX.val('hips', CHAR)+' hips and ' +sX.a_an(sX.desc('butt', CHAR))+' butt. ' +g.Their+' '+descBackAndShoulders+' make '+g.them+' look '+sX.desc('from_behind', CHAR)+' from behind. ' , 'p', 'wide'); out += sX.wrap( g.Their+' arms are '+sX.desc('arms', CHAR)+', with '+sX.desc('delts', CHAR)+' delts and '+sX.desc('bicep', CHAR)+' biceps about '+sX.val('bicep', CHAR) +' around, and '+sX.desc('forearm', CHAR)+' '+sX.val('forearm', CHAR)+' forearms. ' +g.Their+' '+sX.desc('legs', CHAR)+' legs measure '+sX.val('quads', CHAR)+' across '+g.their+' ' +sX.desc('quads', CHAR)+' quads and '+sX.val('calf', CHAR)+' across '+g.their+' '+sX.desc('calf', CHAR)+' calves.' , 'p', 'wide'); out += sX.wrap( 'Overall '+g.they_are+' '+sX.desc('health', CHAR)+' and '+sX.desc('fitness', CHAR)+'.' , 'p', 'wide'); out += "<<linkappend 'CHECK MUSCLETONE'>><<print setup.ALIAS.listMuscleStatus(_OOGLE);>><</linkappend>>"; return out; }, 'char_metric' : function(metric, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('char_metric - NO CHAR!'); } var value = ''; switch(metric) { case 'height': metric = 'ht'; case 'ht': /* if over 10 meters, switch scale, else use cm/ft */ if(CHAR.METRICS[metric]>(0.4*100*10)) { value = sX.formatLength(CHAR.METRICS[metric]); } else { value = sX.formatHeight(CHAR.METRICS[metric]); } break; case 'weight': metric = 'wt'; case 'wt': if(!setup.FLAGS.DISPLAY.base_metrics) { value = sX.formatWeight(sX.weightGet('scaled', CHAR)); } else { value = sX.formatWeight(sX.weightGet('base', CHAR)); } break; case 'bust': value = sX.formatLength(CHAR.METRICS[metric]) +((('male'==CHAR.TRAITS.gender)||('none'==CHAR.TRAITS.gender)) ? '' : " "+ sX.metric_calcBust(CHAR.METRICS['cup'], sX.scale(CHAR.METRICS[metric], 1, CHAR))); break; /* simple measures */ case 'bicep' : case 'quads' : case 'chest' : case 'waist' : case 'hips' : case 'pecs' : case 'forearm' : case 'calf' : value = sX.formatLength(CHAR.METRICS[metric]); break; case 'measurements': case 'figure': value = sX.formatLength(CHAR.METRICS['chest']) +((('male'==CHAR.TRAITS.gender)||('none'==CHAR.TRAITS.gender)) ? '' : " "+ sX.metric_calcBust(CHAR.METRICS['cup'], sX.scale(CHAR.METRICS[metric], 2, CHAR))) +' - '+sX.formatLength(CHAR.METRICS['waist']) +' - '+sX.formatLength(CHAR.METRICS['hips']); break; case 'bodyfat' : case 'bodytone' : value = (sX.weightGet(metric, CHAR)*100).toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1}); break; case 'BMI' : value = sX.weightGet(metric, CHAR).toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1}); break; /* no change, if requested show cup regardless of gender */ case 'cup' : value = sX.metric_calcBust(CHAR.METRICS[metric], sX.scale(CHAR.METRICS[metric], 1, CHAR)); break; case 'age' : value = CHAR.METRICS[metric].toLocaleString(undefined, {minimumFractionDigits: 0, maximumFractionDigits: 0}); break; default: value = null; break; } if(isNaN(value)) { try { $G.ERRORS.NaN['char-'+metric]= ($G.ERRORS.NaN['char-'+metric]+1)||1; } catch(e) {} } return value; }, 'char_select_menu' : function() { var sX=setup.ALIAS; var select_screen = ''; var levels = ''; var characters = ''; var gP = 1.0; /* game.difficulty.level */ var D=setup.DATA.OPTIONS.difficultyLevels; levels += "<<run setup.ALIAS.worldVarSet('game.difficulty.level', "+ D['HardLife'].level +"); setup.ALIAS.worldVarSet('game.difficulty.label', 'HardLife');>>"; levels += "<<link 'CHANGE DIFFICULTY'>><<replace '#difficulty_select_list'>>"; Object.keys(D).forEach(function(difficulty) { levels += "<div class='"+ D[difficulty].build_lv +"'><<link '"+ D[difficulty].label +"<p class=\"pct\">( "+ sX.formatAsPct(D[difficulty].level, 0) +" )</p>'>><<run setup.ALIAS.worldVarSet('game.difficulty.level', "+ D[difficulty].level +"); setup.ALIAS.worldVarSet('game.difficulty.label', '"+ D[difficulty].label +"');>><</link>></div>"; }); levels += "<</replace>><</link>>"; var C=setup.CHARS; Object.keys(C).forEach(function(char_id) { gP = C[char_id]._.girlPower||1.0; characters += "<div class='char "+ C[char_id]._.build_lv +"'><<link '"+ "<div class=\"name\">"+ C[char_id].NAMES.first +"</div>"+ "<div class=\"who\">("+ C[char_id].ABOUT.who_is +")</div>"+ "<div class=\"ht\">"+ sX.char_metric('ht', C[char_id]) +"</div>"+ "<div class=\"wt\">"+ sX.char_metric('wt', C[char_id]) +"</div>"+ "<div class=\"powers\">"+ sX.listPowersSimple(C[char_id]) +"</div>"+ "'>><<run setup.ALIAS.select_char('"+ char_id +"'); >><<set $G.WORLD.girlPower="+ gP +">><<goto $G.PC.PASSAGES.start >><</link>></div>"; }); select_screen += "<div id='difficulty_select_list'>"+ levels +"</div>"; select_screen += "<hr />"; select_screen += "<div id='char_select_list'>"+ characters +"</div>"; return select_screen; }, 'check_sale' : function(item_id) { return 0.0; }, 'combatAction' : function(ATT, DEF, action) { var sX=setup.ALIAS; var RESULT={ 'cnt_msg':'', 'hit_msg':'', 'cnd_msg':'', 'act_group':'main', 'act_name':action, 'act_mode':(action=='auto' ? 'auto' : 'manual'), }; if(!(ATT.stun||ATT.ko||ATT.dead)) { switch(action) { case 'punch': case 'kick': case 'slap': case 'headbutt': RESULT=sX.combatStrike(ATT, DEF, action); break; case 'auto': /* rest if needed, or just to be odd... */ if(Math.random()<(ATT.BODY.Abs.tone-0.34)/3) { RESULT=sX.combatTactics(ATT, DEF, 'taunt'); } else if((Math.random()<0.05)||(ATT.MATRIX.vigor<1 && Math.random()<0.50)) { RESULT=sX.combatTactics(ATT, DEF, ((Math.random()<0.65) ? 'guard' : 'rest')); } else { RESULT=sX.combatStrike(ATT, DEF, action); } break; case 'rest': case 'taunt': case 'guard': RESULT=sX.combatTactics(ATT, DEF, action); break; default: RESULT['error']='unrecognized action: "'+ action +'"'; break; } ATT.last_action = action; } else { RESULT['cnd_msg']=ATT.name_first +' isn't able to fight back.'; /* regen+flow, or decay */ sX.qiFlow(0.034, 1, ATT); sX.do_status_update(ATT); sX.qiFlow(0.034, 1, DEF); sX.do_status_update(DEF); ATT.last_action = null; } return RESULT; }, 'combatDrain' : function(ATT, DEF, action) { var sX=setup.ALIAS; /* sX.statGet(stat, secAlias, CHAR); */ var aS = sX.statGet('all', 'current', ATT); var dS = sX.statGet('all', 'current', DEF); var drain_pct = 0.16*sX.rand(0.06, 0.69); var drain_qi = drain_pct*dS.max_qi*34*(aS.magnitude/dS.magnitude); sX.payCost({'dark':dS.level*3, 'force':dS.level*3}, ATT); sX.powerTransfer(DEF, ATT, drain_pct, {'xfer_height':true}); var foundShards = sX.shardSpawn(ATT, 'vampyric-drain', 0.1); ATT.R.S.blood = (ATT.R.S.blood||0) +foundShards; sX.qiAdd(-drain_qi, DEF); sX.qiAdd(drain_qi, ATT); var dqKarma = sX.logX(10, drain_qi, '-'); sX.darkAdd(dqKarma, ATT); sX.lightAdd(dqKarma, DEF); DEF.drained=true; sX.qiFlow(0.1, 1, DEF); sX.do_status_update(DEF); sX.qiFlow(0.1, 1, ATT); sX.do_status_update(ATT); sX.combat_refreshFighterInfo(ATT); sX.combat_refreshFighterInfo(DEF); return { 'pct' : drain_pct, 'shards' : foundShards, }; }, 'combatHeal' : function(ATT, DEF, action) { var sX=setup.ALIAS; /* sX.statGet(stat, secAlias, CHAR); */ var aS = sX.statGet('all', 'current', ATT); var dS = sX.statGet('all', 'current', DEF); var focus_used = (Math.max(dS.level*3, ATT.MATRIX.focus*0.16) * 0.34*sX.rand(0.16, 3.46)); var heal_amt = (focus_used*sX.rand(1.34, 6.42)); sX.charTempVar(DEF, 'newQi', DEF.MATRIX.qi+heal_amt); sX.payCost({'light':dS.level, 'focus':focus_used+dS.level}, ATT); sX.lightSpend(aS.caliber, ATT); sX.qiAdd(heal_amt, DEF); sX.qiAdd(-(heal_amt/3), ATT); var karma = sX.logX(10, focus_used, '-'); sX.lightAdd((karma)/3, ATT); sX.qiFlow(0.1, 1, DEF); sX.do_status_update(DEF); sX.qiFlow(0.1, 1, ATT); sX.do_status_update(ATT); }, 'combatRevive' : function(ATT, DEF, action) { var sX=setup.ALIAS; DEF.stun = false; DEF.dead = false; DEF.CoD=null; delete DEF.CoD; DEF.MATRIX.qi = Math.abs(DEF.MATRIX.qi*1.5); sX.do_status_update(DEF); sX.do_status_update(ATT); }, 'combatStrike' : function(ATT, DEF, action, counter) { var sX=setup.ALIAS; var RESULT={ 'cnt_msg':'', 'hit_msg':'', 'cnd_msg':'', 'act_group':'strike', 'act_name':action, 'act_mode':(action=='auto' ? 'auto' : 'manual'), }; /* sX.statGet(stat, secAlias, CHAR); */ var aS = sX.statGet('all', 'current', ATT); var dS = sX.statGet('all', 'current', DEF); var aE = ATT.MATRIX; var aMag = aS.magnitude; var aCal = aS.caliber; var aCap = aS.capacity; var aLv = aS.level; var aMin = aLv*aCal; var aName = ATT.name_first; var dE = DEF.MATRIX; var dMag = dS.magnitude; var dCal = dS.caliber; var dCap = dS.capacity; var dLv = dS.level; var dMin = dLv*dCal; var dName = DEF.name_first; var limbTest=true; var limbFail=''; var limbCond=1.0; var defCoreCond = Math.max(1/dCal, DEF.LIMBS.CORE.pct); var aSS = sX.statGet('all', 'mult', ATT); var dSS = sX.statGet('all', 'mult', DEF); var hitRate = 0; var critRate = 0; var hit = 0; var crit = 0; var aStam = 0; var rStam = (_round-6)/(aCal+aS.PHY); var stamCost = 0; var verb = ''; var aG = 'she'==sX.he_she(ATT.gender); var aTheir = sX.his_her(ATT.gender); var aThey = sX.he_she(ATT.gender); var aThem = sX.him_her(ATT.gender); var dG = 'she'==sX.he_she(DEF.gender); var dTheir = sX.his_her(DEF.gender); var dThey = sX.he_she(DEF.gender); var dThem = sX.him_her(DEF.gender); var gMul = sX.rand(0.1, 1.0); var gMulAtt = gMul * ( aG ? aS.caliber : 3.0 ); var gMulDef = gMul * ( dG ? dS.caliber : 3.0 ); var aI = ( aG ? (sX.sqrt(aCal, '-')) : 1 ); var dI = ( dG ? (sX.sqrt(dCal, '-')) : 1 ); var defGuard = (DEF.guarding ? sX.sqrt(dCal, '-') : 1 ); var defFlex = (DEF.flexed ? dCap/2 : 1 )*Math.max(0.1, DEF.BODY.Abs.condition||dCap)/dCap; var defReflect = ( defFlex/aS.STR * ((dSS.STR+dSS.END)-1)/((aSS.STR+aSS.SPD)-1) )/34*(6**sX.rand(-1, 1)); var attExhaust = Math.min(0, aE.vigor); var attRoll = ( Math.max(1.0, sX.rand(0.3*aI, 6+aCal)) * Math.max(aE.fight+attExhaust, aMin) ); var defRoll = ( Math.max(1.0, sX.rand(0.3*dI, 1+dCal)) * Math.max(dE.react, dMin)*defGuard ); var attCrit = ( Math.max(1.0, sX.rand(0.3*aI, 1.5*aI)) * Math.max(aE.skill+attExhaust, aMin) ); var defCrit = ( Math.max(1.0, sX.rand(0.3*dI, 1.5*dI)) * Math.max(dE.guard, dMin)*defGuard ); var atkPow = ( Math.max(1.0, sX.rand(0.3*aI, 1.5*aI)) * Math.max(aE.power+attExhaust, aMin) ); var defPow = ( Math.max(1.0, sX.rand(0.3*dI, 1.5*dI)) * Math.max(dE.tough, dMin)*defGuard ); var dmg = Math.abs(Math.max(1, (atkPow -(defPow*defCoreCond))/10 )); var tuf = Math.abs(Math.max(1, atkPow/(34*defCoreCond) )); var cap = null; var notReady = (false===DEF.ready); if(notReady) { defRoll=sX.sqrt(defRoll, '+'); defReflect/=2; dmg*=2; tuf*=2; } var flexVs = ''; var dK = 0; /* scale down only */ var adRatio = Math.min(1.0, aLv/dLv); /* Counter */ if(counter) { switch(action) { case 'punch': aStam = 1.60; break; case 'kick': aStam = 3.40; break; case 'slap': aStam = 1.34; break; case 'headbutt': aStam = 2.10; break; } stamCost = (aStam*rStam)*5; dS.PHY+= Math.min(dS.PHY*(gMulAtt/100), gMulDef * (0.0015 + ( (stamCost / 42000) * Math.random() * 3)) ); RESULT['cnt_msg']=dName +' tried to '+ action +' <hint>wasting '+ stamCost +' stamina</hint>, but '+ aName +' countered!'+(settings.debugModeInfo ? " <span class='tiny'>[COUNTER: "+ action +"]</span>" :''); action=either('headbutt', 'headbutt', 'headbutt', action, 'auto', 'auto'); RESULT['counter']=true; } /* simple AI */ if('auto'==action) { if('male'==ATT.gender) { action=either('punch','punch','punch','punch','punch','punch','punch','punch','punch','punch','kick','slap'); } else { action=either('punch','punch','punch','kick','kick','slap'); } RESULT.act_name = action; } switch(action) { case 'punch': limbTest = ATT.LIMBS.ARMS.pct>0.0; limbFail = ATT.name_first+''s arms are too badly damaged to throw a punch...'; limbCond = Math.max(1/aCal, ATT.LIMBS.ARMS.pct); dmg *= 0.69*limbCond; tuf *= 0.34*limbCond; /* verb = either('hit', 'punched', 'smacked', 'thrashed', 'hammered', 'backfisted', 'decked', 'uppercut', 'jabbed', 'hooked', 'threw a cross at'); */ verb = 'punched'; hitRate = 0.84; critRate = 0.15; aStam = 1.6; flexVs = (Math.random()<0.15?'elbow':'fist'); break; case 'kick': limbTest = ATT.LIMBS.LEGS.pct>0.0; limbFail = ATT.name_first+''s legs are too badly damaged to kick...'; limbCond = Math.max(1/aCal, ATT.LIMBS.LEGS.pct); dmg *= 1.42*limbCond; /* once you factor higher critRate, this is more like 1.42 */ tuf *= 0.69*limbCond; /* verb = either('kicked', 'kneed', 'struck', 'punted', 'roundhoused', 'dug a heel into', 'slammed into', 'whipped', 'smacked', 'hooked', 'racked', 'stomped'); */ verb = 'kicked'; hitRate = 0.66; critRate = 0.33; aStam = 3.4; flexVs = (Math.random()<0.35?'knee':'foot'); break; case 'slap': limbTest = ATT.LIMBS.ARMS.pct>0.0; limbFail = ATT.name_first+''s arms are too badly damaged to slap...'; limbCond = Math.max(1/aCal, ATT.LIMBS.ARMS.pct); dmg *= 0.34*limbCond; tuf *= 1.16*limbCond; /* verb = either('slapped', 'smacked', 'whacked', 'humiliated', 'backhanded', 'bitchslapped', 'slapped the shit out of'); */ verb = 'slapped'; hitRate = 0.98; critRate = 0.01; aStam = 1.34; /* hold-back... but not too much... */ cap = Math.max(1, dS.max_qi*0.69, dE.qi*1.34)/sX.sqrt(adRatio, '+'); tuf = Math.max(1, Math.min(tuf, dE.tough))/sX.sqrt(adRatio, '+'); flexVs = (Math.random()<0.50?'wrist':'hand'); break; case 'headbutt': limbTest = ATT.LIMBS.CORE.pct>0.0; limbFail = ATT.name_first+''s core is too badly damaged to headbutt...'; limbCond = Math.max(1/aCal, ATT.LIMBS.CORE.pct); dmg *= 0.16*limbCond; tuf *= 1.42*limbCond; /* verb = either('headbutted', 'slammed', 'cracked', 'thrashed', 'hammered', 'backfisted', 'decked', 'uppercut', 'jabbed', 'hooked', 'threw a cross at'); */ verb = 'headbutted'; hitRate = 0.34; critRate = 0.65; aStam = 2.1; /* hold-back */ cap = Math.max(1, dS.max_qi*0.69, dE.qi*1.69); tuf = Math.max(1, Math.min(tuf, dE.tough*6)); flexVs = ( ( (Math.random()<0.65) && DEF.flexed ) ?'shoulder' :'skull'); break; default: break; } /* chance to hit/crit/counter */ hit = attRoll/defRoll * hitRate * ((aSS.INS+aSS.SPD-1)/(dSS.WSD+dSS.SPD-1)); crit = attCrit/defCrit * critRate * ((aSS.INS+aSS.SPD-1)/(dSS.WSD+dSS.SPD-1)); /* costs twice as much to swing and miss, half as much to counter... */ stamCost = (aStam*rStam / (counter ? 2 : (hit<0.5 ? 0.5 : 1))) / (1.1**(aSS.PHY)); /* hits get rougher the longer the fight goes */ dmg = ((dmg/defGuard) + stamCost) * (aSS.STR / dSS.END); tuf = ((tuf/defGuard) + (aCal/dCal*aLv)) * (aSS.STR / dSS.END); dK = sX.sqrt(dmg, '-')/adRatio; var reflectMult = 1.0; var reflectMsg = ''; if(DEF.flexed) { switch(true) { case ((defReflect> 34.690) ): reflectMult=163.46; reflectMsg=' '+aName+' nearly broke '+aTheir+' '+flexVs+' against the diamond-hard wall of '+dName+''s flexed abs.'; break; case ((defReflect> 16.346) ): reflectMult= 34.69; reflectMsg=' '+aName+' hurt '+aTheir+' '+flexVs+' against '+dName+''s steely abdominals.'; break; case ((defReflect> 6.901) ): reflectMult= 13.46; reflectMsg=' The strike bounced harmlessly off '+dTheir+' firm abs.'; break; case ((defReflect> 3.469) ): reflectMult= 6.90; reflectMsg=' The hit landed with a dull thud.'; break; case ((defReflect> 1.634) ): reflectMult= 3.46; reflectMsg=' It barely dented '+dTheir+' taught abs.'; break; case ((defReflect> 0.841) ): reflectMult= 1.63; reflectMsg=' '+dName+' let out a soft grunt and winced sligtly.'; break; case ((defReflect< 0.016) ): reflectMult= 0.03; reflectMsg=' The brutal attack doubled '+dName+' over, knocking the wind out of '+dThem+'.'; break; case ((defReflect< 0.069) ): reflectMult= 0.16; reflectMsg=' '+dName+' groaned in pain as the '+flexVs+' blasted deep into '+dTheir+' soft flesh.'; break; default: reflectMult= 0.69; reflectMsg=' '+dName+' grunted as the hit connected.'; break; } } else { switch(true) { case ((defReflect> 34.690) ): reflectMult=163.46; reflectMsg=' '+aName+' nearly broke '+aTheir+' '+flexVs+' against '+dName+''s rock-hard physique.'; break; case ((defReflect> 16.346) ): reflectMult= 34.69; reflectMsg=' '+aName+' hurt '+aTheir+' '+flexVs+' against '+dName+''s steely muscles.'; break; case ((defReflect> 6.901) ): reflectMult= 13.46; reflectMsg=' The strike bounced harmlessly off '+dTheir+' firm body.'; break; case ((defReflect> 3.469) ): reflectMult= 6.90; reflectMsg=' The hit landed with a dull thud.'; break; case ((defReflect> 1.634) ): reflectMult= 3.46; reflectMsg=' It barely dented '+dTheir+' taught frame.'; break; case ((defReflect> 0.420) ): reflectMult= 1.63; reflectMsg=' '+dName+' let out a soft grunt and winced sligtly.'; break; case ((defReflect< 0.006) ): reflectMult= 0.03; reflectMsg=' '+dName+' was sent reeling from the brutal attack.'; break; case ((defReflect< 0.034)&&('headbutt'===action) ): reflectMult= 0.16; reflectMsg=' '+dName+' saw stars as '+aName+''s hard skull slammed into '+dTheir+' forehead.'; break; case ((defReflect< 0.034) ): reflectMult= 0.16; reflectMsg=' '+dName+' groaned in pain as the '+flexVs+' blasted deep into '+dTheir+' soft flesh.'; break; default: reflectMult= 0.69; reflectMsg=' '+dName+' grunted as the hit connected.'; break; } } var dmgReflect = Math.min(Math.min(dmg, dS.max_qi/10)*sX.unstack(defReflect)*(dMag/aMag)*reflectMult, dS.max_qi*dCal/dMag); var tufReflect = Math.min((tuf/6)*dmgReflect, dS.max_qi/100); dmg/=reflectMult; /* sX.debugLog(dmgReflect); */ var hitMult = 1.0; switch(true) { case (!limbTest): RESULT.type = 'limbFail'; RESULT['hit_msg'] = limbFail; break; /* COUNTER */ case (((hit+crit)<0.3) && !counter && !DEF.stun && DEF.counter): return sX.combatStrike(DEF, ATT, action, 'counter'); break; /* MISS */ case ((hit<0.5) && DEF.evade): dmg = 0; dmgReflect = 0; tuf = 0; tufReflect = 0; RESULT.type = 'miss'; RESULT['hit_msg']= aName +' tried to '+ action +' <hint>wasting '+ sX.formatSignificant(stamCost) +' stamina</hint>, but '+ dName +' wasn't there...' +(settings.debugModeInfo ? " <span class='tiny'>[MISS: "+ action +"]</span>" :''); break; /* HIT */ case (crit<0.7): hitMult = (1+(hit/10)); dmg *= hitMult; dmgReflect *= sX.unstack(hitMult); /* TRY TO HOLD BACK */ if(cap) { dmg=Math.min(dmg, cap*(0.5+Math.random())); tuf=Math.min(tuf, cap*(0.5+Math.random())/5); } RESULT.type = 'hit'; RESULT['hit_msg']= aName +' '+ verb +' '+ dName +' for '+ sX.formatSignificant(dmg+tuf) +' damage <hint>expending '+ sX.formatSignificant(stamCost) +' stamina and taking '+ sX.formatSignificant(dmgReflect+tufReflect) +' damage to '+ aTheir +' '+ flexVs +' in the process</hint>.' +(settings.debugModeInfo ? " <span class='tiny'>[HIT: "+ action +"]</span>" :''); break; /* CRIT */ default: hitMult = (1+sX.sqrt(crit, '-'))*(1+(hit/10)); dmg *= hitMult; dmgReflect *= sX.unstack(hitMult)*3; /* TRY TO HOLD BACK */ if(cap) { dmg=Math.min(dmg, cap*(0.5+Math.random())*2); tuf=Math.min(tuf, cap*(0.5+Math.random())/2); } tuf *= 3; tufReflect *= 3; RESULT.type = 'crit'; RESULT['hit_msg']= aName +' slammed '+ dName +' with a '+ action +' for '+ sX.formatSignificant(dmg+tuf) +'! <hint>using '+ sX.formatSignificant(stamCost) +' stamina and hurting '+ aTheir +' '+ flexVs +' for '+ sX.formatSignificant(dmgReflect+tufReflect) +' damage</hint>.' +(settings.debugModeInfo ? " <span class='tiny'>[CRIT: "+ action +"]</span>" :''); break; } var PARAMS = { 'ATT' : ATT, 'DEF' : DEF, 'RESULT': RESULT, 'cap' : cap, }; dmg = sX.putInBounds(dmg, 'combatStrike-dmg', PARAMS); tuf = sX.putInBounds(tuf, 'combatStrike-tuf', PARAMS); stamCost = sX.putInBounds(stamCost, 'combatStrike-stamCost', PARAMS); if(!DEF.dead && !DEF.comatose && !('miss'===RESULT.type)) { RESULT['hit_msg']+=reflectMsg; } if(notReady) { RESULT['hit_msg']+=' '+dName+' wasn't able to react in time.'; } DEF.MATRIX.tough -= tuf; ATT.MATRIX.tough -= tufReflect; sX.energySpend('vigor', stamCost, ATT); /* aE.vigor -= stamCost; */ sX.qiAdd(- dmg , DEF); sX.qiAdd(- dmgReflect , ATT); /* gain tops out at gMul% current stats */ if(!DEF.dead) { sX.statGrow('STR', 'evolve', Math.min(aS.STR*(gMulAtt/100), gMulAtt * (0.0011 + ( (sX.pow(dS.STR, 1/3, '+') / 1000) * Math.random() * 3)) ), ATT); sX.statGrow('PHY', 'evolve', Math.min(aS.PHY*(gMulAtt/100), gMulAtt * (0.0015 + ( (sX.pow(stamCost, 1/3, '+') / 1000) * Math.random() * 3)) ), ATT); sX.statGrow('INS', 'evolve', Math.min(aS.INS*(gMulAtt/100), gMulAtt * (0.0017) ), ATT); sX.statGrow('END', 'evolve', Math.min(dS.END*(gMulDef/100), gMulDef * (0.0009 + ( (sX.pow(dmg, 1/3, '+') / 3000) * Math.random() * 3 )) *defGuard ), DEF); sX.statGrow('SPD', 'evolve', Math.min(dS.SPD*(gMulDef/100), gMulDef * (0.0021) *defGuard ), DEF); sX.statGrow('WSD', 'evolve', Math.min(dS.WSD*(gMulDef/100), gMulDef * (0.0012) *defGuard ), DEF); sX.statGrow('STR', 'evolve', Math.min(aS.STR*(gMulAtt/100), gMulDef * (0.0011 + ( (sX.pow(aS.STR, 1/3, '+') / 1000) * Math.random() * 3)) ), DEF); sX.statGrow('SPD', 'evolve', Math.min(aS.SPD*(gMulDef/100), gMulDef * (0.0021) ), ATT); /* bonus END for giving opponents free shots... */ if(!DEF.counter && DEF.last_action=='taunt') { /* +0.5 training from flex/strike */ sX.statGrow( 'END', 'train', Math.min((dS.END+aS.STR)*(gMulAtt/100), gMulDef * (0.034 + ( (sX.pow(dmg, 1/2, '+') / 1000) * Math.random() * 3 )) ), DEF); /* -0.1 health from organ damage */ sX.statGrow( 'END', 'health', -Math.min((dS.END+aS.STR)*(gMulAtt/100), gMulDef * (0.0034 + ( (sX.pow(dmg, 1/10, '+') / 3000) * Math.random() * 3 )) ), DEF); /* +0.5 evolution */ if(dG) { sX.statGrow( 'END', 'genes', Math.min((dS.END+aS.STR)*(gMulAtt/100), gMulDef * (0.034 + ( (sX.pow(dmg, 1/2, '+') / 1000) * Math.random() * 3 )) ), DEF); } /* do abdominal damage and training */ var dmg_units = dmg / dS.max_qi; DEF.BODY.Abs.damage += dmg_units/dS.caliber; DEF.BODY.Abs.fatigue += dmg_units/dS.magnitude; DEF.BODY.Abs.train += dmg_units/dS.capacity; } var karma = sX.logX(10, 3*aLv +dK, '-'); sX.darkAdd( karma, ATT); sX.lightAdd(karma, DEF); } /* regen+flow, or decay */ sX.qiFlow(0.034, 1, ATT); sX.do_status_update(ATT); sX.qiFlow(0.034, 1, DEF); sX.do_status_update(DEF); RESULT['cnd_msg']= dName +' '+ sX.combat_refreshFighterCondition(DEF); return RESULT; }, 'combatTactics' : function(ATT, DEF, action) { var sX=setup.ALIAS; var RESULT={ 'cnt_msg':'', 'hit_msg':'', 'cnd_msg':'', 'act_group':'main', 'act_name':action, 'act_mode':(action=='auto' ? 'auto' : 'manual'), }; var qiFlowMult = 1.000; var qiFlowBase = 0.069; var attTheir = sX.his_her(ATT.gender); var defTheir = sX.his_her(DEF.gender); var attThey = sX.he_she(ATT.gender); var defThey = sX.he_she(DEF.gender); /* DEFAULT STATE */ ATT.guarding=false; ATT.ready=true; ATT.flexed=false; ATT.evade=true; switch(action) { case 'rest': qiFlowMult=6.0; ATT.ready=false; ATT.evade=false; RESULT['hit_msg']= ATT.name_first +' took a moment to catch '+ attTheir +' breath and clear '+ attTheir +' head.'; break; case 'guard': /* TOGGLE ON */ qiFlowMult=3.0; ATT.guarding=true; ATT.counter=true; RESULT['hit_msg']= ATT.name_first +' took a defensive stance and waited for an opening in '+ attTheir +' enemy's guard...'; break; case 'taunt': /* TOGGLE OFF */ qiFlowMult=2.0; ATT.counter=false; ATT.flexed=true; ATT.evade=false; RESULT['hit_msg']= ATT.name_first +' flexed '+ attTheir +' abs and taunted '+ attTheir +' opponent to take '+ defTheir +' best shot...'; break; case 'flirt': qiFlowMult=1.34; ATT.ready=false; /* ??? */ break; } /* X sec active recovery */ sX.recoverActive(qiFlowMult/3600, ATT); sX.qiFlow(qiFlowBase*qiFlowMult , 1, ATT); sX.do_status_update(ATT); sX.qiFlow(qiFlowBase , 1, DEF); sX.do_status_update(DEF); RESULT['cnd_msg']= ATT.name_first +' '+ sX.combat_refreshFighterCondition(ATT); return RESULT; }, 'combatWithdraw' : function(ATT, DEF, action) { var sX=setup.ALIAS; var RESULT={ 'cnt_msg':'', 'hit_msg':'', 'cnd_msg':'', 'act_group':'widraw', 'act_name':action, 'act_mode':(action=='auto' ? 'auto' : 'manual'), }; var attRoll = 0; var attPow = 0; var defRoll = 0; var defPow = 0; /* sX.statGet(stat, secAlias, CHAR); */ var aS = sX.statGet('all', 'current', ATT); var dS = sX.statGet('all', 'current', DEF); var aE = ATT.MATRIX; var aLv = aS.level; var aCal = aS.caliber; var aMin = aLv*aCal; var dE = DEF.MATRIX; var dLv = dS.level; var dCal = dS.caliber; var dMin = dLv*dCal; var sMsg = ''; var fMsg = ''; var tMsg = ''; var attThem = sX.him_her(ATT.gender||ATT.TRAITS.gender); var defThem = sX.him_her(DEF.gender||DEF.TRAITS.gender); var withdraw = 0.0; var tkLight = aE.light+dE.light; var tkDark = aE.dark+dE.dark; var aSS = sX.statGet('all', 'mult', ATT); var dSS = sX.statGet('all', 'mult', DEF); switch(action) { case 'flee': /* chance to be caught by defender... the one acting is ALWAYS the ATT, so in this case the ATT uses defensive stats and the DEF uses offensive ones... */ attPow = Math.max(0.1, (aE.power + aE.train + aE.react + aE.vigor + aE.aware))*(((aSS.SPD*3)+aSS.END+aSS.PHY+aSS.STR+aSS.WSD-6)); defPow = Math.max(0.1, (dE.power + dE.skill + dE.fight + dE.vigor + dE.focus))*(((dSS.SPD*3)+dSS.END+dSS.PHY+dSS.STR+dSS.INS-6)); attRoll = sX.rand(0.1, 6.0); defRoll = sX.rand(0.1, 3.0); sMsg = ATT.name_first +' outran '+ DEF.name_first +', leaving '+ defThem +' in the dust...'; tMsg = ATT.name_first +' almost escaped, but '+ DEF.name_first +' was too fast for '+ attThem +'...'; fMsg = ATT.name_first +' tried to run, but '+ DEF.name_first +' caught '+ attThem +'.'; withdraw = ((attPow*attRoll)/(defPow*defRoll))*(tkLight/tkDark); /* ATT burn energy trying to escape... */ aE.power -= Math.max( aMin, (attPow/aS.PHY) * sX.rand(0.34, 1.34) / (aSS.PHY/2) ); aE.train -= Math.max( aMin, (attPow/aS.PHY) * sX.rand(0.23, 1.16) ); aE.react -= Math.max( aMin, (attPow/aS.PHY) * sX.rand(0.23, 1.16) ); aE.vigor -= Math.max( aMin, (attPow/aS.PHY) * sX.rand(0.42, 3.16) / (aSS.PHY*2) ); aE.aware -= Math.max( aMin, (attPow/aS.PHY) * sX.rand(0.23, 1.16) ); /* DEF burn energy trying to chase... */ dE.power -= Math.max( dMin, (defPow/dS.PHY) * sX.rand(1.34, 3.46) / (aSS.PHY/2) ); dE.skill -= Math.max( dMin, (defPow/dS.PHY) * sX.rand(0.34, 2.16) ); dE.fight -= Math.max( dMin, (defPow/dS.PHY) * sX.rand(0.69, 2.16) ); dE.vigor -= Math.max( dMin, (defPow/dS.PHY) * sX.rand(1.69, 4.23) / (aSS.PHY*2) ); dE.focus -= Math.max( dMin, (defPow/dS.PHY) * sX.rand(0.16, 2.16) ); /* succeed or fail, the attempt to flee burns light karma */ sX.lightAdd(-sX.logX(10, aMin*10, '-'), ATT); sX.lightAdd(-sX.logX(10, dMin* 1, '-'), DEF); /* stat bonus for the workout... */ /* sX.statGrow(stat, secAlias, trainAmt, CHAR); */ sX.statGrow('PHY', 'evolve', 0.069*attRoll, ATT); sX.statGrow('PHY', 'evolve', 0.069*defRoll, DEF); sX.statGrow('SPD', 'evolve', 0.042*attRoll, ATT); sX.statGrow('SPD', 'evolve', 0.042*defRoll, DEF); sX.statGrow('END', 'evolve', 0.034*attRoll, ATT); sX.statGrow('STR', 'evolve', 0.034*defRoll, DEF); break; } switch(true) { case (withdraw>1.42): RESULT['hit_msg'] = sMsg; RESULT['escaped'] = ATT.escaped = true; break; /* win */ case (withdraw>0.72): RESULT['hit_msg'] = tMsg; RESULT['escaped'] = ATT.escaped = false; break; /* tie */ case (withdraw>0.00): RESULT['hit_msg'] = fMsg; RESULT['escaped'] = ATT.escaped = false; break; /* lose */ default: break; /* error */ } sX.qiFlow(0.134, 1, ATT); sX.do_status_update(ATT); sX.qiFlow(0.069, 1, DEF); sX.do_status_update(DEF); return RESULT; }, 'combat_loadP2' : function(P2) { var sX=setup.ALIAS; var S = sX.statGet('all', 'current', P2); P2['level'] = (S.level).toFixed(0); P2['caliber'] = (S.caliber).toFixed(0); sX.regenerateBody(0.0001, 0.0001, P2); sX.do_status_update(P2); P2['str'] = sX.statPrint('STR', P2); P2['end'] = sX.statPrint('END', P2); P2['spd'] = sX.statPrint('SPD', P2); P2['phy'] = sX.statPrint('PHY', P2); P2['ins'] = sX.statPrint('INS', P2); P2['wsd'] = sX.statPrint('WSD', P2); P2.tone = sX.char_metric('bodytone', P2); P2.fat = sX.char_metric('bodyfat', P2); P2.bicep = sX.char_metric('bicep', P2); P2.quads = sX.char_metric('quads', P2); P2.figure = sX.char_metric('figure', P2); P2.wt = sX.char_metric('weight', P2); P2.age = sX.val('age' , P2); P2.gender = sX.val('gender' , P2); P2.ht = sX.val('ht' , P2); State.setVar( '_P2', P2 ); }, 'combat_refreshAll' : function() { return " <<run setup.ALIAS.combat_refreshFighterInfo(_P1); setup.ALIAS.combat_refreshFighterCondition(_P1); >> <<run setup.ALIAS.combat_refreshFighterInfo(_P2); setup.ALIAS.combat_refreshFighterCondition(_P2); >> <<replace '#combat_p1'>><<include 'COMBAT P1'>><</replace>> <<replace '#combat_p2'>><<include 'COMBAT P2'>><</replace>> <<replace '#combat_act'>><<include 'ACTIONS COMBAT'>><</replace>> "; }, 'combat_refreshFighterCondition' : function(CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('combat_refreshFighterCondition - NO CHAR!'); } var desc = null; var stun = false; switch(true) { case (CHAR.STATUS.qi=='obliterated'): desc=' has been completely destroyed!'; /* stun=true; */ break; case (CHAR.STATUS.qi=='torn apart'): desc=' has been ripped to pieces...'; /* stun=true; */ break; case (CHAR.STATUS.qi=='mangled'): desc=' is now just a heap of crushed bones and squished organs...'; /* stun=true; */ break; case (CHAR.STATUS.qi=='killed'): desc=' is dead.'; /* stun=true; */ break; case (CHAR.STATUS.qi=='broken'): desc=' is lying broken on the ground.'; /* stun=true; */ break; case (CHAR.STATUS.qi=='comatose'): desc=' needs medical attention.'; /* stun=true; */ break; case (CHAR.STATUS.qi=='unconscious'): desc=' is out cold.'; /* stun=true; */ break; case (CHAR.STATUS.qi=='dazed'): desc=' is dazed.'; /* stun=true; */ break; case (CHAR.STATUS.tough=='hurt'): desc=' is hurt.'; /* stun=false; */ break; case (CHAR.STATUS.tough=='bruised'): desc=' is bruised.'; /* stun=false; */ break; default: desc=' is fine.'; /* stun=false; */ break; } /* CHAR.stun = stun; */ return desc; }, 'combat_refreshFighterInfo' : function(F_CHAR) { var sX=setup.ALIAS; if(!F_CHAR) { sX.debugLog('combat_refreshFighterInfo - NO CHAR!'); } var bwt = sX.weightGet('scaled', F_CHAR); F_CHAR.age = sX.val('age' , F_CHAR); F_CHAR.gender = sX.val('gender' , F_CHAR); F_CHAR.ht = sX.formatHeight(F_CHAR.METRICS.ht); F_CHAR.wt = sX.formatWeight(bwt); F_CHAR.str = sX.statPrint('STR', F_CHAR); F_CHAR.end = sX.statPrint('END', F_CHAR); F_CHAR.spd = sX.statPrint('SPD', F_CHAR); F_CHAR.phy = sX.statPrint('PHY', F_CHAR); F_CHAR.ins = sX.statPrint('INS', F_CHAR); F_CHAR.wsd = sX.statPrint('WSD', F_CHAR); /* sX.statGet(stat, secAlias, CHAR); */ var S = sX.statGet('all', 'current', F_CHAR); F_CHAR.level = (S.level).toLocaleString(undefined, {minimumFractionDigits: 0, maximumFractionDigits: 0}); F_CHAR.caliber = (S.caliber).toLocaleString(undefined, {minimumFractionDigits: 0, maximumFractionDigits: 0}); F_CHAR.magnitude = (S.magnitude).toLocaleString(undefined, {minimumFractionDigits: 0, maximumFractionDigits: 0}); F_CHAR.tone = sX.char_metric('bodytone', F_CHAR); F_CHAR.fat = sX.char_metric('bodyfat', F_CHAR); F_CHAR.bicep = sX.char_metric('bicep', F_CHAR); F_CHAR.quads = sX.char_metric('quads', F_CHAR); F_CHAR.figure = sX.char_metric('figure', F_CHAR); }, 'darkAdd' : function(amt, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('darkAdd - NO CHAR!'); } CHAR.MATRIX.dark += amt; CHAR.MATRIX.light += amt * -0.5; }, 'darkShift' : function(amt, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('darkShift - NO CHAR!'); } CHAR.MATRIX.dark += amt; CHAR.MATRIX.light -= amt; if(CHAR.MATRIX.light<0) { CHAR.MATRIX.dark += CHAR.MATRIX.light; CHAR.MATRIX.light = 0; } }, 'darkSpend' : function(amt, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('darkSpend - NO CHAR!'); } sX.karmaAdd(-sX.logX(10, amt, '-'), CHAR); sX.darkShift(amt*3, CHAR); }, 'delItem' : function(item_id, CHAR) { var sX=setup.ALIAS; if(!CHAR) { setup.ALIAS.debugLog('delItem - NO CHAR!'); } delete CHAR.STUFF[item_id]; return true; }, 'depleteItem' : function(item_id, qty, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('depleteItem - NO CHAR!'); } qty=qty||1; /* option to multi-use */ if(!CHAR.STUFF[item_id]) { return false; } if(('all'==qty)||('*'==qty)) { qty=CHAR.STUFF[item_id]; } CHAR.STUFF[item_id]-=qty; return true; }, 'desc' : function(trait, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('desc - NO CHAR!'); } var desc = ''; if(setup.DESC[trait]) { desc = setup.DESC[trait](CHAR); } else { desc = sX.descMissing(trait); } return desc; }, 'describePassage' : function(passage) { passage=passage||State.passage; var desc=''; if( $G.PC.STATE.lastPassage==passage ) { desc=$G.PC.STATE.passageDesc; } else { switch(passage) { case 'GO FOR A WALK' : case 'GO FOR A JOG' : case 'GO FOR A RUN' : case 'DO AEROBICS' : case 'DO CALISTHENICS' : case 'DO YOGA' : case 'POST WORKOUT' : case 'PUSH YOURSELF' : desc = 'exercising'; break; case 'ENTER BATHROOM' : desc = 'in the bathroom'; break; case 'FILLOUT APPLICATION' : desc = 'filling an application'; break; case 'EQUIP' : desc = 'changing'; break; case 'FOOD' : desc = 'eating'; break; case 'STUFF' : desc = 'going through your stuff'; break; case 'SPEND KARMA' : desc = 'growing'; break; case 'SELF' : desc = 'looking in the mirror'; break; case 'LOOK FOR CHANGE' : desc = 'searching'; break; case 'GO HOME' : desc = 'home'; break; case 'LIVING ON STREET' : desc = 'on the street'; break; case 'LIVING IN PRISON' : desc = 'in your cell'; break; case 'LIVING IN CAR' : desc = 'sitting in the car'; break; case 'LIVING IN MOTEL' : desc = 'in your room'; break; case 'SLEEP IN CAR' : case 'SLEEP IN BED' : case 'REST A BIT' : case 'TAKE A NAP' : desc = 'resting'; break; case 'S-MART' : case 'CHECKOUT APPAREL' : case 'CHECKOUT AUTOMOTIVE' : case 'CHECKOUT ELECTRONICS' : case 'CHECKOUT FURNITURE' : case 'CHECKOUT GARDEN' : case 'CHECKOUT GROCERY' : case 'CHECKOUT HARDWARE' : case 'CHECKOUT HOUSEHOLD' : case 'CHECKOUT HYGIENE' : case 'CHECKOUT OFFICE' : case 'CHECKOUT PHARMACY' : case 'CHECKOUT SEASONAL' : case 'CHECKOUT SPORTING GOODS' : case 'LIST ITEMS FOR AISLE' : desc = 'shopping'; break; default: desc = '...'; break; } } return desc; }, 'developPower' : function(power_id, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('developPower - NO CHAR!'); } /* cost = next_level^3 *100; */ }, 'doDamageMATRIX' : function(MATRIX, total, units, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('doDamageMATRIX - NO CHAR!'); } units=units||1; total=total||1; MATRIX=sX.prepMATRIX(MATRIX); total = MATRIX['prepMATRIX-total']; delete MATRIX['prepMATRIX-total']; var B = CHAR.BODY; /* sX.statGet(stat, secAlias, CHAR); */ var S = sX.statGet('all', 'current', CHAR); var cal = S.caliber; var cap = S.capacity; var phyRt = sX.sqrt(S.PHY, '-'); var lv = S.level; /* move from a flat 1.0 damage to something that scales with caliber and muscle-tone */ var baseRate = sX.pow(lv/cal, 2, '-')/6; var damage = 0.0; var fatigue = 0.0; var pastFailure = 0.0; Object.keys(MATRIX).forEach(function(part) { if(B[part]) { if( (!B[part].damage )||( isNaN(B[part].damage) ) ) { B[part].damage = 0; } if( (!B[part].train )||( isNaN(B[part].train) ) ) { B[part].train = cal/2; } if( (!B[part].fatigue )||( isNaN(B[part].fatigue) ) ) { B[part].fatigue = 0; } damage = (MATRIX[part]*units/total) * (0.06+baseRate*(cap-B[part].train)/cap); fatigue = damage*(42/(cap+phyRt)); /* training past failure causes excessive muscle damage... */ pastFailure = Math.max(0, B[part].damage+damage+B[part].fatigue+fatigue-(cap*B[part].train)); B[part].damage += damage+(pastFailure*3); B[part].train += damage/(42*cap); B[part].fatigue += fatigue; } }); sX.doTrainingMATRIX( MATRIX, total, (0.42/cap), CHAR); }, 'doEnergyMATRIX' : function(MATRIX, units, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('doEnergyMATRIX - NO CHAR!'); } if(typeof units==='undefined' || isNaN(units)) units=1; units=sX.putInBounds(units, 'doEnergyMATRIX-units'); var old_val = null; Object.keys(MATRIX).forEach(function(resource) { if(typeof CHAR.MATRIX[resource] === 'undefined') { CHAR.MATRIX[resource]=0; } old_val = CHAR.MATRIX[resource]; switch(true){ case ('petro'==resource): case ('money'==resource): case ('kcal'==resource): case ('protein'==resource): case ('sugar'==resource): case ('light'==resource): case ('dark'==resource): CHAR.MATRIX[resource] += (MATRIX[resource] * units); /* no bonus for cost-entries, only non-fuel gain entries */ break; case ('karma'==resource): sX.karmaAdd(sX.logX(10, MATRIX[resource] * units, '-'), CHAR); break; case ('qi'==resource): sX.qiAdd(MATRIX[resource] * units, CHAR); break; default: CHAR.MATRIX[resource] += (MATRIX[resource] * units); if(MATRIX[resource]>0) { CHAR.MATRIX[resource] *= (1+(Math.random()*sX.sqrt(MATRIX[resource] * units, '0')/100)); } break; } if(isNaN(CHAR.MATRIX[resource])) { try { $G.ERRORS.NaN['char-'+resource]= ($G.ERRORS.NaN['char-'+resource]+1)||1; } catch(e) {} } }); /* make sure we have not exceeded max, and apply any status changes */ sX.do_status_update(CHAR); return true; }, 'doExplore' : function(activity, hours, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('doExplore - NO CHAR!'); } hours=sX.putInBounds(hours||setup.ACTIONS.EXPLORE[activity].hours, 'doExplore-hours'); var act = Object.assign({}, setup.ACTIONS.EXPLORE[activity].MATRIX); var bodymass = sX.calcBodyMass(CHAR); /* CALLED WITH UNITS, NOT HOURS, BUT SINCE THE MATRIX IS NORMALIZED TO HOURS, THIS IS FINE */ act.kcal*= bodymass; act.protein*= bodymass; act.sugar*= bodymass; sX.doEnergyMATRIX(act, hours, CHAR); /* ACTION EVENT CALLBACK */ if(typeof setup.ACTIONS.EXPLORE[activity].onAction == 'function') { setup.ACTIONS.EXPLORE[activity].onAction(hours); } $G.PC.STATE.lastActivity = activity; $G.PC.STATE.lastAction = 'explore'; /* Adjust the clock */ sX.passTime(hours, CHAR); return true; }, 'doLift' : function(CHAR, PARAMS) { var sX=setup.ALIAS; var sW=setup.WORKOUTS; if(!CHAR) { sX.debugLog('doLift - NO CHAR!'); } var workout = PARAMS.workout ||_workout ||'Military Press'; var weight = PARAMS.weight ||_weight ||sX.weightGet('scaled', CHAR); var bonus = PARAMS.bonus ||_bonus ||'*'; var reps = PARAMS.reps ||_reps ||1; /* sX.statGet(stat, secAlias, CHAR); */ var S = sX.statGet('all', 'current', CHAR); var SS = sX.statGet('all', 'mult', CHAR); if(isNaN(reps)) { /* auto/max-reps */ reps = sX.calcReps(workout, weight, CHAR); reps = 5+('WSD'==bonus ? reps/S.level*S.caliber/S.magnitude : reps); } var effort = 1; var stam = 1; var out = ''; if(sX.canDo('TRAIN', sW[workout].action, 0.1, 0.5, CHAR)) { if(reps>=1.0) { $G.WORLD.girlPower += 0.001; effort = 1; sX.recoverActive(0.1, CHAR); out = "Pushing yourself to your limits, you managed "+ Math.floor(reps) +" full rep"+(Math.floor(reps)==1 ? '' : 's')+' at the '+workout+" with a "+ sX.formatWeight(weight, settings.units, false) +(weight<0 ? ' assist.' : ' load.'); /* sX.statGrow(stat, secAlias, trainAmt, CHAR); */ sX.statGrow(bonus, 'train', 0.001*S.caliber, CHAR); } else { /* do more muscle damage on a failed lift... */ switch(true) { case (reps<0.50): $G.WORLD.girlPower -= 0.001; effort = 4; /* sX.statGrow(stat, secAlias, trainAmt, CHAR); */ sX.statGrow(bonus, 'train', 0.001, CHAR); stam *= 3; out = "You try with all your might, but can't even budge the weight."; break; case (reps<0.75): sX.doDamageMATRIX( sW[workout].MATRIX, sW[workout].total, 3.0, CHAR); effort = 3; /* sX.statGrow(stat, secAlias, trainAmt, CHAR); */ sX.statGrow(bonus, 'train', 0.001, CHAR); out = "You made it almost halfway, before you're muscles gave out."; break; case (reps<1.00): sX.doDamageMATRIX( sW[workout].MATRIX, sW[workout].total, 2.0, CHAR); effort = 2; /* sX.statGrow(stat, secAlias, trainAmt, CHAR); */ sX.statGrow(bonus, 'train', 0.001, CHAR); out = "You almost had it, but couldn't quite finish the rep."; break; } } /* 5 min allocated, but only 1 min workout... */ stam = ((weight*reps*effort)/ (S.level*(SS.SPD+SS.END+SS.PHY+SS.STR-3+S.magnitude))); sX.doWorkout(sW[workout].action, 1/60, 0.42+(S.caliber*S.caliber/3), CHAR, { 'MATRIX':{ 'vigor':-stam*1.34, 'tough':-stam, 'power':-stam/1.34, }, }); switch(bonus) { case 'STR': effort*=1.65; break; case 'PHY': effort*=1.85; break; case 'WSD': effort*=0.15; break; case 'END': effort*=1.45; break; case 'SPD': effort*=1.85; break; case 'INS': effort*=0.65; break; default: effort*=1.00; break; } sX.doDamageMATRIX( sW[workout].MATRIX, sW[workout].total, effort, CHAR); sX.passTime(4/60, CHAR); } else { out = "You're too tired to workout right now, perhaps you should take a minute to catch your breath and rehydrate..."; } /* performance issue resolved, no reason to hide the muscle-status update... */ out += sX.listMuscleStatus(CHAR); return out; }, 'doNutritionMATRIX' : function(MATRIX, units, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('doEnergyMATRIX - NO CHAR!'); } if(typeof units==='undefined' || isNaN(units)) units=1; units=sX.putInBounds(units, 'doEnergyMATRIX-units'); var old_val = null; var NUTRITION={ 'STR':0, 'PHY':0, 'WSD':0, 'END':0, 'SPD':0, 'INS':0, }; Object.keys(MATRIX).forEach(function(resource) { switch(resource){ case 'vigor': NUTRITION['STR']+=MATRIX[resource]*units; NUTRITION['PHY']+=MATRIX[resource]*units; break; case 'train': NUTRITION['STR']+=MATRIX[resource]*units; NUTRITION['WSD']+=MATRIX[resource]*units; break; case 'tough': NUTRITION['STR']+=MATRIX[resource]*units; NUTRITION['END']+=MATRIX[resource]*units; break; case 'power': NUTRITION['STR']+=MATRIX[resource]*units; NUTRITION['SPD']+=MATRIX[resource]*units; break; case 'skill': NUTRITION['STR']+=MATRIX[resource]*units; NUTRITION['INS']+=MATRIX[resource]*units; break; case 'aware': NUTRITION['PHY']+=MATRIX[resource]*units; NUTRITION['WSD']+=MATRIX[resource]*units; break; case 'vital': NUTRITION['PHY']+=MATRIX[resource]*units; NUTRITION['END']+=MATRIX[resource]*units; break; case 'metab': NUTRITION['PHY']+=MATRIX[resource]*units; NUTRITION['SPD']+=MATRIX[resource]*units; break; case 'focus': NUTRITION['PHY']+=MATRIX[resource]*units; NUTRITION['INS']+=MATRIX[resource]*units; break; case 'guard': NUTRITION['WSD']+=MATRIX[resource]*units; NUTRITION['END']+=MATRIX[resource]*units; break; case 'react': NUTRITION['WSD']+=MATRIX[resource]*units; NUTRITION['SPD']+=MATRIX[resource]*units; break; case 'psych': NUTRITION['WSD']+=MATRIX[resource]*units; NUTRITION['INS']+=MATRIX[resource]*units; break; case 'regen': NUTRITION['END']+=MATRIX[resource]*units; NUTRITION['SPD']+=MATRIX[resource]*units; break; case 'force': NUTRITION['END']+=MATRIX[resource]*units; NUTRITION['INS']+=MATRIX[resource]*units; break; case 'fight': NUTRITION['SPD']+=MATRIX[resource]*units; NUTRITION['INS']+=MATRIX[resource]*units; break; default: break; } }); Object.keys(NUTRITION).forEach(function(stat) { sX.statGrow(stat, 'health', (NUTRITION[stat]/10000), CHAR); }); return true; }, 'doRest' : function(activity, hours, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('doRest - NO CHAR!'); } hours=sX.putInBounds(hours||setup.ACTIONS.REST[activity].hours, 'doRest-hours'); var bodymass = sX.calcBodyMass(CHAR); /* PROCESS REST MATRIX */ var act = Object.assign({}, setup.ACTIONS.REST[activity].MATRIX); act.kcal*= bodymass; act.protein*= bodymass; act.sugar*= bodymass; sX.doEnergyMATRIX(act, hours, CHAR); /* ACTIVE REGEN and slow-bleedoff */ sX.energyBleedOff(hours/2, null, CHAR); sX.recoverActive(hours, CHAR); CHAR.MATRIX.kcal -= (bodymass*hours*0.35); /* ACTION EVENT CALLBACK */ if(typeof setup.ACTIONS.REST[activity].onAction == 'function') { setup.ACTIONS.REST[activity].onAction(hours); } $G.PC.STATE.lastActivity = activity; $G.PC.STATE.lastAction = 'rest'; /* Adjust the clock */ sX.passTime(hours, CHAR); /* Update status again, as weight may have changed */ sX.do_status_update(CHAR); return true; }, 'doTrainingMATRIX' : function(MATRIX, total, units, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('doTrainingMATRIX - NO CHAR!'); } units=sX.putInBounds(units, 'doTrainingMATRIX-units'); units=units||1; total=total||1; Object.keys(MATRIX).forEach(function(part) { CHAR.BODY[part].train+=(MATRIX[part]*units/total); }); }, 'doWorkout' : function(activity, hours, level, CHAR, PARAMS) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('doWorkout - NO CHAR!'); } PARAMS=PARAMS||{}; PARAMS.MATRIX=PARAMS.MATRIX||{}; level=sX.putInBounds(level||1.0, 'doWorkout-level'); hours=sX.putInBounds(hours||Math.min(setup.ACTIONS.TRAIN[activity].hours,sX.maxHours('TRAIN', activity, level, CHAR)), 'doWorkout-hours'); var ACT = Object.assign({}, setup.ACTIONS.TRAIN[activity].MATRIX); /* MATRIX OVERRIDES */ Object.keys(PARAMS.MATRIX).forEach(function(key) { ACT[key] = PARAMS.MATRIX[key]; }); var bodymass = sX.calcBodyMass(CHAR); var f = ('she'===sX.he_she(CHAR.TRAITS.gender)); var effort = (hours*level)+(f ? $G.WORLD.amazonIndex : 3); $G.WORLD.girlPower += 0.001; /* CALLED WITH UNITS, NOT HOURS, BUT SINCE THE MATRIX IS NORMALIZED TO HOURS, THIS IS FINE */ ACT.kcal*= bodymass; ACT.protein*= bodymass; ACT.sugar*= bodymass; sX.doEnergyMATRIX(ACT, effort, CHAR); sX.trainSTATS(ACT, effort*6, CHAR); /* ACTION EVENT CALLBACK */ if(typeof setup.ACTIONS.TRAIN[activity].onAction == 'function') { setup.ACTIONS.TRAIN[activity].onAction(hours); } $G.PC.STATE.lastExercise = activity; $G.PC.STATE.lastActivity = activity; $G.PC.STATE.lastAction = 'workout'; /* Adjust the clock */ sX.passTime(hours, CHAR); return true; }, 'do_status_update' : function(CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('do_status_update - NO CHAR!'); } /* TODO: make this only run ONCE per load! */ sX.versionUpdate(); sX.before_update(CHAR); var E = CHAR.MATRIX; if(isNaN(E.kcal)) { E.kcal=0; } if(isNaN(E.light)) { E.light=0; } if(isNaN(E.dark)) { E.dark=0; } sX.statRefresh(CHAR); /* set metrics */ sX.update_bodysize(CHAR); sX.weightSetMin('base', 0.01, CHAR); CHAR.METRICS.ht = Math.max(CHAR.METRICS.ht, 0.01); /* put stats in upper bounds, do one cycle at 1/1000 decay */ sX.energyBleedOff(1, 0.001, CHAR); sX.updateConditions(CHAR); if(CHAR===$G.PC) { sX.update_world(CHAR); } sX.after_update(CHAR); sX.refresh_detail(); }, 'enemyBigger' : function(ENEMY, pct) { var sX=setup.ALIAS; /* sX.statGet(stat, secAlias, CHAR); */ var S = sX.statGet('all', 'current', ENEMY); var M = ENEMY.METRICS; var E = ENEMY.MATRIX; var AzI = $G.WORLD.amazonIndex; var they = sX.he_she(ENEMY.TRAITS.gender||ENEMY.gender); pct += ('she'==they ? (pct+(AzI/100)) : 0); for(var i=0; i<(pct*600); i++) { sX.statGrow(either( 'STR', 'END', 'SPD', 'PHY', 'WSD', 'INS' ), 'train', 0.5, ENEMY); } sX.statGrow('STR', 'train', S.STR * ((pct*sX.rand(1.00, 1.20))), ENEMY)+sX.rand(0.30, 0.60); sX.statGrow('END', 'train', S.END * ((pct*sX.rand(0.90, 1.15))), ENEMY)+sX.rand(0.20, 0.40); sX.statGrow('SPD', 'train', S.SPD * ((pct*sX.rand(0.80, 1.10))), ENEMY)+sX.rand(0.25, 0.50); sX.statGrow('PHY', 'train', S.PHY * ((pct*sX.rand(0.70, 0.95))), ENEMY)+sX.rand(0.15, 0.30); sX.statGrow('WSD', 'train', S.WSD * ((pct*sX.rand(0.60, 0.90))), ENEMY)+sX.rand(0.10, 0.20); sX.statGrow('INS', 'train', S.INS * ((pct*sX.rand(0.50, 0.85))), ENEMY)+sX.rand(0.05, 0.10); M.ht += (S.caliber*pct)/5; sX.weightAdd('base', (S.caliber*(1+(pct*1.0)))/2, ENEMY); /* scale energy levels to new max */ sX.qiAdd(Math.abs(E.qi)*( (1+(pct*1.34))*(1+(pct*1.34)) )-E.qi, ENEMY); }, /* TODO: finish this and its associated functions... */ 'enemyForget' : function(WHO, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('enemyForget - NO CHAR!'); } /* TODO: ensure every NPC has a UID, and adjust array-keys accordingly */ var uid = WHO.uid||WHO.name; delete CHAR.ENEMIES[uid]; sX.npcForget(WHO, CHAR, 'enemy'); }, 'enemyRemember' : function(WHO, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('enemyRemember - NO CHAR!'); } WHO.encountered = new Date; var enemyName = ''; if(WHO.uid) { enemyName = WHO.uid; } else { enemyName = WHO.name; var i=2; while(CHAR.ENEMIES[enemyName]) { enemyName = WHO.name+' ('+ i +')'; i++; } } CHAR.ENEMIES[enemyName] = WHO; sX.npcRemember(WHO, CHAR, 'enemy'); }, 'energyAdd' : function(energy, amt, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('energyAdd - NO CHAR!'); } CHAR.MATRIX[energy]+=amt; sX.qiFlow(0.1, 1, CHAR); }, 'energyBleedOff' : function(cycles, loss, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('energyBleedOff - NO CHAR!'); } cycles = cycles || 1.0; loss = loss || 0.1; var rate = 1 - loss; var falloff = sX.pow(rate, cycles, '-'); var E = CHAR.MATRIX; /* sX.statGet(stat, secAlias, CHAR); */ var S = sX.statGet('all', 'current', CHAR); var kfalloff = sX.pow((1 - (loss/100)), cycles, '-'); /* correct for negative karma by shifting polarity */ var kNeg = Math.abs(Math.min(0, CHAR.MATRIX.light)+Math.min(0, CHAR.MATRIX.dark)); CHAR.MATRIX.light+=kNeg; CHAR.MATRIX.dark+=kNeg; /* put stats in upper bounds */ E.vigor = Math.min( E.vigor, (S.STR + S.PHY)*S.magnitude ); E.train = Math.min( E.train, (S.STR + S.WSD)*S.magnitude ); E.tough = Math.min( E.tough, (S.STR + S.END)*S.magnitude ); E.power = Math.min( E.power, (S.STR + S.SPD)*S.magnitude ); E.skill = Math.min( E.skill, (S.STR + S.INS)*S.magnitude ); E.aware = Math.min( E.aware, (S.PHY + S.WSD)*S.magnitude ); E.vital = Math.min( E.vital, (S.PHY + S.END)*S.magnitude ); E.metab = Math.min( E.metab, (S.PHY + S.SPD)*S.magnitude ); E.focus = Math.min( E.focus, (S.PHY + S.INS)*S.magnitude ); E.guard = Math.min( E.guard, (S.WSD + S.END)*S.magnitude ); E.react = Math.min( E.react, (S.WSD + S.SPD)*S.magnitude ); E.psych = Math.min( E.psych, (S.WSD + S.INS)*S.magnitude ); E.regen = Math.min( E.regen, (S.END + S.SPD)*S.magnitude ); E.force = Math.min( E.force, (S.END + S.INS)*S.magnitude ); E.fight = Math.min( E.fight, (S.SPD + S.INS)*S.magnitude ); E.light = Math.min(CHAR.MATRIX.light, S.light_well*S.magnitude); E.dark = Math.min(CHAR.MATRIX.dark , S.dark_well *S.magnitude); sX.qiCalc(CHAR); /* bleed off excessive energy at 10% per cycle */ if(E.vigor>(S.STR + S.PHY)) { E.regen *= falloff; } if(E.train>(S.STR + S.WSD)) { E.react *= falloff; } if(E.tough>(S.STR + S.END)) { E.metab *= falloff; } if(E.power>(S.STR + S.SPD)) { E.power *= falloff; } if(E.skill>(S.STR + S.INS)) { E.fight *= falloff; } if(E.aware>(S.PHY + S.WSD)) { E.guard *= falloff; } if(E.vital>(S.PHY + S.END)) { E.vital *= falloff; } if(E.metab>(S.PHY + S.SPD)) { E.tough *= falloff; } if(E.focus>(S.PHY + S.INS)) { E.force *= falloff; } if(E.guard>(S.WSD + S.END)) { E.aware *= falloff; } if(E.react>(S.WSD + S.SPD)) { E.train *= falloff; } if(E.psych>(S.WSD + S.INS)) { E.psych *= falloff; } if(E.regen>(S.END + S.SPD)) { E.vigor *= falloff; } if(E.force>(S.END + S.INS)) { E.focus *= falloff; } if(E.fight>(S.SPD + S.INS)) { E.skill *= falloff; } /* bleed off excessive karma at 1% per cycle */ if(E.light>S.light_well) { E.light *= kfalloff; } if(E.dark >S.dark_well) { E.dark *= kfalloff; } }, 'energySpend' : function(energy, amt, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('energySpend - NO CHAR!'); } /* if you have to strain, this is really going to hurt! */ if(amt>(CHAR.MATRIX[energy]-1)) { amt*=3; } sX.energyAdd(energy, -amt, CHAR); return true; }, 'equipItem' : function(item_id, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('equipItem - NO CHAR!'); } /* broken, allows ANY item to be equipped on ANY slot */ var slot_id = sX.getItem(item_id).role; if(setup.ROLES.EQUIP_ZONES.hasOwnProperty(slot_id)) { CHAR.EQUIP[slot_id] = item_id; return true; } else { /* item does not match a known slot type */ return false; } }, 'exitPassage' : function(encounter, passage) { var sX=setup.ALIAS; passage=passage||State.passage; encounter=encounter||_encounter; if(setup.ENCOUNTERS[encounter].overrideExit) { return ''; } else { return setup.PASSAGES[passage].exit(); sX.showSideBar(); } }, 'findCash' : function(min_find, max_find, karmic_boost, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('findCash - NO CHAR!'); } var diff=(($G.PC.NAMES===CHAR.NAMES) ? sX.worldVarGet('game.difficulty.level', 1.0) : 1.0); min_find=sX.putInBounds(min_find|| 3, 'findCash-min_find'); max_find=sX.putInBounds(max_find||300, 'findCash-max_find'); if(typeof karmic_boost==='undefined') { karmic_boost=true; } var k_mul = (karmic_boost ? 0.1 + (sX.sqrt(sX.getTotalKarma(CHAR), '0')/1000) : 1 ); var found = Math.floor( (Math.random()*(max_find-min_find)+min_find)*k_mul /diff ); /* grr.... */ /* if(isNaN(found)) { found=0; } */ return found; }, 'findChange' : function(min_find, max_find, karmic_boost, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('findChange - NO CHAR!'); } var diff=(($G.PC.NAMES===CHAR.NAMES) ? sX.worldVarGet('game.difficulty.level', 1.0) : 1.0); min_find=sX.putInBounds(min_find|| 30, 'findChange-min_find'); max_find=sX.putInBounds(max_find||300, 'findChange-max_find'); /* sX.statGet(stat, secAlias, CHAR); */ var Mag = sX.statGet('CALC', 'Mag', CHAR); if(typeof karmic_boost==='undefined') { karmic_boost=true; } var k_mul = (karmic_boost ? 0.1 + (sX.logX(10, sX.getTotalKarma(CHAR), '0')*Mag/100) : 1 ); return Math.floor( (Math.random()*(max_find-min_find)+min_find)*k_mul /diff )/100; }, 'fixDate' : function(dateObj) { var sX=setup.ALIAS; dateObj=dateObj||$G.PC.STATE.Date; if(isNaN(dateObj.getTime())) { dateObj = new Date(); } if(isNaN($G.PC.STATE.Date.getTime())) { $G.PC.STATE.Date = dateObj; sX.brokeTime($G.PC); } }, 'foodCard' : function(item_id) { var sX=setup.ALIAS; var ITEM = setup.DATA.ITEMS[item_id]; /* item UIDs may now contain periods and other CSS illegal characters! */ var cssSafeID=sX.CSS_safeID(item_id); /* REQUIRES _SOURCE_CHAR & _TARGET_CHAR TO BE SET BEFORE CALLING THIS... */ /* sX.WTF(item_id, true); */ var i_open = _uses % setup.DATA.ITEMS[item_id].uses; var i_pack = setup.DATA.ITEMS[item_id].uses; var i_uses = _SOURCE_CHAR.STUFF[item_id] || 0; if(i_uses<1) { return ""; } return " <div class='top_bar glass'><h4 class='item_name'>"+ ITEM.name +"</h4></div> <div class='info glass'> <div class='icon-frame'> <div><span class='uses'>Pack: "+ ITEM.uses +"</span></div> <div><img class='icon glass' /></div> <div><span class='uses'>Total: <span class='on_hand'>"+ i_uses +"</span></span></div> </div> <div class='detail-pane'> <div class='details'> <span>Calories:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.kcal) +"</span> <span>Protein:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.protein) +"g</span> <span>Sugar:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.sugar) +"g</span> "+(settings.lod_energyMatrix ? " <span>regen:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.regen) +"</span> <span>react:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.react) +"</span> <span>metab:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.metab) +"</span> <span>power:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.power) +"</span> <span>fight:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.fight) +"</span> <span>guard:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.guard) +"</span> <span>vital:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.vital) +"</span> <span>tough:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.tough) +"</span> <span>force:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.force) +"</span> <span>aware:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.aware) +"</span> <span>train:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.train) +"</span> <span>psych:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.psych) +"</span> <span>vigor:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.vigor) +"</span> <span>focus:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.focus) +"</span> <span>skill:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.skill) +"</span> " : '')+" </div> </div> </div> <div class='bottom_bar glass'>Use: <span class='link'> <<link '[one]'>> <<run setup.ALIAS.useItem( '"+ item_id +"', 1, _SOURCE_CHAR, _TARGET_CHAR ); >> <<replace '#"+ cssSafeID +"'>><<print setup.ALIAS.foodCard('"+ item_id +"');>><</replace>> <</link>> </span> <<if "+ i_uses+ ">9>> <span class='link'> <<link '[ten]'>> <<run setup.ALIAS.useItem( '"+ item_id +"', 10, _SOURCE_CHAR, _TARGET_CHAR ); >> <<replace '#"+ cssSafeID +"'>><<print setup.ALIAS.foodCard('"+ item_id +"');>><</replace>> <</link>> </span> <</if>> <<if "+ i_open +">0>> <span class='link'> <<link '[pack]'>> <<run setup.ALIAS.useItem( '"+ item_id +"', "+ i_open +", _SOURCE_CHAR, _TARGET_CHAR ); >> <<replace '#"+ cssSafeID +"'>><<print setup.ALIAS.foodCard('"+ item_id +"');>><</replace>> <</link>> </span> <<elseif "+ i_uses +">="+ i_pack +">> <span class='link'> <<link '[pack]'>> <<run setup.ALIAS.useItem( '"+ item_id +"', "+ i_pack +", _SOURCE_CHAR, _TARGET_CHAR ); >> <<replace '#"+ cssSafeID +"'>><<print setup.ALIAS.foodCard('"+ item_id +"');>><</replace>> <</link>> </span> <</if>> <<if "+ i_uses+ ">99>> <span class='link'> <<link '[100]'>> <<run setup.ALIAS.useItem( '"+ item_id +"', 100, _SOURCE_CHAR, _TARGET_CHAR ); >> <<replace '#"+ cssSafeID +"'>><<print setup.ALIAS.foodCard('"+ item_id +"');>><</replace>> <</link>> </span> <</if>> </div> "; }, 'formatMatrixValue' : function(value) { if((typeof value=='undefined')||value==0) { return '-'; } return (value>0 ? '+' : '')+ value.toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1}); }, 'generateBlankChar' : function(PARAMS) { var sX=setup.ALIAS; PARAMS=PARAMS||{}; /* OLD DATA STRUCTURE COMPONENTS */ var CHAR = { 'NAMES' : {}, 'TRAITS' : { 'gender' : null, }, 'PASSAGES' : {}, 'MATRIX' : {}, 'METRICS' : { 'base_ht' : 72, }, 'STATUS' : {}, 'STUFF' : {}, 'EQUIP' : {}, 'PROPERTY' : {}, 'STATE' : {}, 'SLAVES' : {}, 'ENEMIES' : {}, 'FRIENDS' : {}, 'LOVERS' : {}, 'POWERS' : {}, 'SKILLS' : {}, 'DEVICES' : {}, 'BODY' : {}, }; /* NEW DATA STRUCTURE */ sX.hlObj_addRootNodes(CHAR); CHAR.B = { '_' : {}, 'BONES' : {}, 'GENES' : { 'sex' : null, 'TRAITS' : {}, }, 'JOINTS' : {}, 'LIMBS' : {}, 'MUSCLES' : {}, 'ORGANS' : {}, 'RACES' : {}, 'SPECIES' : {}, }; CHAR.M = { 'HEIGHT' : null, 'WEIGHT' : { 'BODY' : {}, 'CACHE' : {}, 'CALC' : {}, 'SCALED' : {}, 'updated' : null, }, }; CHAR.R = { 'S' : {}, }; CHAR.S = { 'CALC' : {}, 'STR' : {}, 'PHY' : {}, 'WSD' : {}, 'END' : {}, 'SPD' : {}, 'INS' : {}, }; ['HEIGHT','BICEP','FOREARM','QUADS','CALF','CHEST','WAIST','HIPS','PECS','TITS','ASS'].forEach(function(key) { CHAR.M[key] = { 'PERM' : { 'tone' : 0, 'racegen' : 0, 'wt' : 0, 'stat' : 0, 'oil' : 0, 'flex' : ((key==='HEIGHT'||key==='WAIST'||key==='HIPS') ?null :0), 'pump' : ((key==='HEIGHT'||key==='WAIST'||key==='HIPS') ?null :0), }, 'TEMP' : {}, 'STR' : {}, 'base' : 0, 'min' : 0, '~cache' : 0, }; }); CHAR.M.WAIST.PERM.stress=0; CHAR.M.WAIST.PERM.starve=0; CHAR.M.TITS.PERM.lactation=0; return CHAR; }, 'generateCharFromLicense' : function(LICENSE) { var sX=setup.ALIAS; var PARTIAL = sX.generateBlankChar(); var min=0.5; var max=1.5; PARTIAL['name'] = LICENSE.name; PARTIAL['name_first'] = LICENSE.name.split(' ')[0]; PARTIAL['age'] = LICENSE.age; PARTIAL['gender'] = LICENSE.gender; PARTIAL['genpro'] = LICENSE.genpro; PARTIAL['TRAITS']['gender'] = LICENSE.gender; PARTIAL['METRICS'] = { 'age' : LICENSE.age, 'base_ht' : LICENSE.base_ht, 'scale' : LICENSE.scale, 'ht' : LICENSE.ht, 'wt' : LICENSE.wt, 'adj_wt' : LICENSE.adj_wt, 'bust' : LICENSE.bust, }; PARTIAL['S'] = sX.generateRandomEncounterStats(PARTIAL, {'wt':LICENSE.wt}); sX.statRefresh(PARTIAL); /* PROBLEM IS HERE... */ PARTIAL['MATRIX'] = sX.generateRandomEncounterMatrix(PARTIAL, min, max); delete PARTIAL.MATRIX['max_qi']; PARTIAL['BODY'] = sX.new_BODY(1, PARTIAL.S.CALC.Cap); sX.weightConvert(PARTIAL); PARTIAL.MATRIX['light'] = PARTIAL.S.CALC['light_well']*(Math.random()*(max-min)+min); PARTIAL.MATRIX['dark'] = PARTIAL.S.CALC['dark_well']*(Math.random()*(max-min)+min); PARTIAL['ht'] = sX.formatHeight(LICENSE.ht); PARTIAL['wt'] = sX.formatWeight(LICENSE.adj_wt); PARTIAL['uid'] = sX.generateUID_fromName(PARTIAL.name); return PARTIAL; }, 'generateCreature' : function(species, PARAMS) { var sX=setup.ALIAS; PARAMS=PARAMS||{}; /* PARAM OVERRIDES */ PARAMS.lvScale = PARAMS.lvScale || 0; /* lv*2^lvScale */ PARAMS.scale = PARAMS.scale || (1.1**PARAMS.lvScale); /* BEGIN CONSTRUCTION */ var BASELINE = setup.DATA.SPECIES[species]; var PARTIAL = sX.generateBlankChar(); var BLOCK = {}; sX.WTF({'a':{ 'entry' : species, 'DATA' : BASELINE, 'BLOCK' : BLOCK, 'PARAMS' : PARAMS, 'PARTIAL' : PARTIAL, }}); BLOCK=null; /* OBJECT PROTOTYPE UID */ BLOCK = sX.cdb_parseCompressedObject(BASELINE['uid' ], {}, PARAMS); PARTIAL._.uid = BLOCK['']; sX.WTF({'b':{ 'entry' : 'uid', 'DATA' : BASELINE['uid'], 'BLOCK' : BLOCK, 'PARAMS' : PARAMS, 'PARTIAL' : PARTIAL, }}); BLOCK=null; /* SPECIES ANCESTRY */ BLOCK = sX.cdb_parseCompressedObject(BASELINE['species' ], {}, PARAMS); PARTIAL.B.SPECIES = BLOCK; sX.WTF({'c':{ 'entry' : 'species', 'DATA' : BASELINE['species'], 'BLOCK' : BLOCK, 'PARAMS' : PARAMS, 'PARTIAL' : PARTIAL, }}); BLOCK=null; /* RACIAL ANCESTRY */ BLOCK = sX.cdb_parseCompressedObject(BASELINE['race' ], {}, PARAMS); PARTIAL.B.RACES = BLOCK; sX.WTF({'d':{ 'entry' : 'race', 'DATA' : BASELINE['race'], 'BLOCK' : BLOCK, 'PARAMS' : PARAMS, 'PARTIAL' : PARTIAL, }}); BLOCK=null; /* BODY TYPE */ BLOCK = sX.cdb_parseCompressedObject(BASELINE['body' ], {}, PARAMS); PARTIAL.B._.body_type = BLOCK['']; sX.WTF({'f':{ 'entry' : 'body', 'DATA' : BASELINE['body'], 'BLOCK' : BLOCK, 'PARAMS' : PARAMS, 'PARTIAL' : PARTIAL, }}); BLOCK=null; /* ORGAN TYPE */ BLOCK = sX.cdb_parseCompressedObject(BASELINE['organs' ], {}, PARAMS); PARTIAL.B._.organ_type = BLOCK['']; sX.WTF({'g':{ 'entry' : 'organs', 'DATA' : BASELINE['organs'], 'BLOCK' : BLOCK, 'PARAMS' : PARAMS, 'PARTIAL' : PARTIAL, }}); BLOCK=null; /* METABOLIC TYPES */ BLOCK = sX.cdb_parseCompressedObject(BASELINE['metabolism' ], {}, PARAMS); PARTIAL.E.SOURCES = BLOCK; sX.WTF({'h':{ 'entry' : 'metabolism', 'DATA' : BASELINE['metabolism'], 'BLOCK' : BLOCK, 'PARAMS' : PARAMS, 'PARTIAL' : PARTIAL, }}); BLOCK=null; /* SEX GENES */ BLOCK = sX.cdb_parseCompressedObject(BASELINE['sex' ], {}, PARAMS); Object.keys(BLOCK).forEach(function(key) { BLOCK[key] *= 100; }); PARTIAL.B.GENES.sex = sX.spinTheWheel(BLOCK); PARTIAL.TRAITS.gender = PARAMS.gender = sX.genForSex(PARTIAL.B.GENES.sex, 'gen'); PARTIAL.TRAITS.gen = PARAMS.gen = sX.genForSex(PARTIAL.B.GENES.sex, 'g'); sX.WTF({'i':{ 'entry' : 'sex', 'DATA' : BASELINE['sex'], 'BLOCK' : BLOCK, 'PARAMS' : PARAMS, 'PARTIAL' : PARTIAL, }}); BLOCK=null; /* AGE */ BLOCK = sX.cdb_parseCompressedObject(BASELINE['age' ], {}, PARAMS); PARTIAL.METRICS.age = PARAMS.age = BLOCK['']; PARTIAL.B.age = BLOCK['']; sX.WTF({'j':{ 'entry' : 'age', 'DATA' : BASELINE['age'], 'BLOCK' : BLOCK, 'PARAMS' : PARAMS, 'PARTIAL' : PARTIAL, }}); BLOCK=null; /* HEIGHT */ BLOCK = sX.cdb_parseCompressedObject(BASELINE['height' ], {}, PARAMS); PARTIAL.METRICS.ht = PARAMS.ht = BLOCK['']; PARTIAL.B.ht = BLOCK['']; sX.WTF({'k':{ 'entry' : 'height', 'DATA' : BASELINE['height'], 'BLOCK' : BLOCK, 'PARAMS' : PARAMS, 'PARTIAL' : PARTIAL, }}); BLOCK=null; /* WEIGHT */ BLOCK = sX.cdb_parseCompressedObject(BASELINE['WEIGHT.base' ], {}, PARAMS); PARTIAL.B.WT = BLOCK; PARAMS.wt = sX.sumArray(BLOCK); PARTIAL.M.WEIGHT.BODY = BLOCK; sX.weightCalc(PARTIAL); sX.WTF({'l':{ 'entry' : 'WEIGHT.base', 'DATA' : BASELINE['WEIGHT.base'], 'BLOCK' : BLOCK, 'PARAMS' : PARAMS, 'PARTIAL' : PARTIAL, }}); BLOCK=null; /* BASE LEVEL */ BLOCK = sX.cdb_parseCompressedObject(BASELINE['level' ], {}, PARAMS); PARTIAL.METRICS.base_lv = BLOCK['']; PARAMS.Lv = BLOCK['']; PARAMS.Cal = sX.unstack(PARAMS.Lv); PARAMS.Mag = sX.unstack(PARAMS.Cal); PARAMS.Cap = PARAMS.Cal+PARAMS.Mag; sX.WTF({'m':{ 'entry' : 'level', 'DATA' : BASELINE['level'], 'BLOCK' : BLOCK, 'PARAMS' : PARAMS, 'PARTIAL' : PARTIAL, }}); BLOCK=null; /* BASE STATS */ BLOCK = sX.cdb_parseCompressedObject(BASELINE['STATS.base' ], { 'STR':PARAMS.Lv*sX.rng_range(0.5, 1.5), 'PHY':PARAMS.Lv*sX.rng_range(0.5, 1.5), 'WSD':PARAMS.Lv*sX.rng_range(0.5, 1.5), 'END':PARAMS.Lv*sX.rng_range(0.5, 1.5), 'SPD':PARAMS.Lv*sX.rng_range(0.5, 1.5), 'INS':PARAMS.Lv*sX.rng_range(0.5, 1.5), }, PARAMS); var STATS=Object.assign({}, BLOCK); Object.assign(PARAMS, STATS); sX.WTF({'n':{ 'entry' : 'STATS.base', 'DATA' : BASELINE['STATS.base'], 'BLOCK' : BLOCK, 'PARAMS' : PARAMS, 'PARTIAL' : PARTIAL, }}); BLOCK=null; /* STATS - PERMANENT TRAINING MODIFIERS */ BLOCK = sX.cdb_parseCompressedObject(BASELINE['STATS.PERM' ], { 'drain' : sX.rng_range( -PARAMS.Cap, PARAMS.Cap ), 'evolve' : sX.rng_range( -PARAMS.Cap, PARAMS.Cap ), 'genes' : sX.rng_range( -PARAMS.Cap, PARAMS.Cap ), 'karma' : sX.rng_range( -PARAMS.Cap, PARAMS.Cap ), 'primal' : sX.rng_range( -PARAMS.Cap, PARAMS.Cap ), 'train' : sX.rng_range( -PARAMS.Cap, PARAMS.Cap ), 'health' : sX.rng_range( -PARAMS.Cap, PARAMS.Cap ), 'energy' : sX.rng_range( -PARAMS.Cap, PARAMS.Cap ), }, PARAMS); var PERM=Object.assign({}, BLOCK); Object.assign(PARAMS, PERM); Object.keys(STATS).forEach(function(key) { PARTIAL.S[key]= { 'base' : STATS[key], 'pow' : 0, '~cache' : STATS[key], 'PERM' : {}, 'TEMP' : {}, }; Object.keys(PERM).forEach(function(key2) { PARTIAL.S[key].PERM[key2] = ((STATS[key]-(PARAMS.Lv+PARAMS.Mag))/PARAMS.Cap+PERM[key2]); PARTIAL.S[key]['~cache'] += PARTIAL.S[key].PERM[key2]; }); }); sX.WTF({'o':{ 'entry' : 'STATS.PERM', 'DATA' : BASELINE['STATS.PERM'], 'BLOCK' : BLOCK, 'PARAMS' : PARAMS, 'PARTIAL' : PARTIAL, }}); /* BASE METRIC OVERRIDES */ BLOCK = sX.cdb_parseCompressedObject(BASELINE['METRICS' ], {}, PARAMS); /* TODO: bust... */ Object.keys(BLOCK).forEach(function(key) { PARTIAL.METRICS[key]=BLOCK[key]; if(!PARTIAL.M[key]) { PARTIAL.M[key]= {}; } PARTIAL.M[key].base=BLOCK[key]; }); sX.WTF({'p':{ 'entry' : 'METRICS', 'DATA' : BASELINE['METRICS'], 'BLOCK' : BLOCK, 'PARAMS' : PARAMS, 'PARTIAL' : PARTIAL, }}); BLOCK=null; /* POWERS */ BLOCK = sX.cdb_parseCompressedObject(BASELINE['powers' ], {}, PARAMS); Object.keys(BLOCK).forEach(function(key) { if(BLOCK[key]>0) { PARTIAL.POWERS[key]={ 'label' : key, 'rank' : BLOCK[key], }; } }); sX.WTF({'q':{ 'entry' : 'powers', 'DATA' : BASELINE['powers'], 'BLOCK' : BLOCK, 'PARAMS' : PARAMS, 'PARTIAL' : PARTIAL, }}); BLOCK=null; /* ATTIRE ALIAS */ BLOCK = sX.cdb_parseCompressedObject(BASELINE['attire' ], {}, PARAMS); /* TODO: clothing display... */ Object.keys(BLOCK).forEach(function(key) { BLOCK[key] *= 100; }); PARTIAL._.attire = sX.spinTheWheel(BLOCK); PARAMS.attire = PARTIAL._.attire; sX.WTF({'r':{ 'entry' : 'attire', 'DATA' : BASELINE['attire'], 'BLOCK' : BLOCK, 'PARAMS' : PARAMS, 'PARTIAL' : PARTIAL, }}); BLOCK=null; /* ADDITIONAL EQUIPMENT */ /* TODO: */ if(BASELINE['EQUIP' ]) { BLOCK = sX.cdb_parseCompressedObject(BASELINE['EQUIP' ], {}, PARAMS); } sX.WTF({'s':{ 'entry' : 'EQUIP', 'DATA' : BASELINE['EQUIP'], 'BLOCK' : BLOCK, 'PARAMS' : PARAMS, 'PARTIAL' : PARTIAL, }}); BLOCK=null; /* ITEMS / LOOT */ /* TODO: parse STUFF... add clothing, etc. */ if(BASELINE['STUFF' ]) { BLOCK = sX.cdb_parseCompressedObject(BASELINE['STUFF' ], {}, PARAMS); } sX.WTF({'t':{ 'entry' : 'STUFF', 'DATA' : BASELINE['STUFF'], 'BLOCK' : BLOCK, 'PARAMS' : PARAMS, 'PARTIAL' : PARTIAL, }}); BLOCK=null; /* UPDATE STATS, MATRIX, BODY, STATUS */ sX.statRefresh(PARTIAL); PARTIAL.MATRIX = sX.generateRandomEncounterMatrix(PARTIAL, 0.5, 2.0); delete PARTIAL.MATRIX.max_qi; sX.WTF({'u':{ 'entry' : 'statRefresh', 'DATA' : BASELINE['species'], 'BLOCK' : PARTIAL.MATRIX, 'PARAMS' : PARAMS, 'PARTIAL' : PARTIAL, }}); PARTIAL['BODY'] = sX.new_BODY(1, PARAMS.Cap); sX.regenerateBody(0.0001, 0.0001, PARTIAL); sX.do_status_update(PARTIAL); sX.WTF({'v':{ 'entry' : 'regenerateBody', 'BLOCK' : PARTIAL['BODY'], 'PARAMS' : PARAMS, 'PARTIAL' : PARTIAL, }}); /* SPECIES DISPLAY NAME - parse this last, so we can use additional PARAM keys in naming */ BLOCK = sX.cdb_parseTextField(BASELINE['display' ], PARAMS); PARTIAL._.name = BLOCK; PARTIAL.name = BLOCK; PARTIAL.name_first = BLOCK; sX.WTF({'e':{ 'entry' : 'display', 'DATA' : BASELINE['display'], 'BLOCK' : BLOCK, 'PARAMS' : PARAMS, 'PARTIAL' : PARTIAL, }}); /* SPECIES MEMBER GENERATION COMPLETE... */ return PARTIAL; }, 'generateRandomEncounterMatrix' : function(CHAR, min, max) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('getBalanceDark - NO CHAR!'); } min=min||0.5; max=max||2.0; var S=sX.statGet('all', 'current', CHAR); var MATRIX = { 'vigor' : (S.STR + S.PHY + S.level), 'train' : (S.STR + S.WSD + S.level), 'tough' : (S.STR + S.END + S.level), 'power' : (S.STR + S.SPD + S.level), 'skill' : (S.STR + S.INS + S.level), 'aware' : (S.PHY + S.WSD + S.level), 'vital' : (S.PHY + S.END + S.level), 'metab' : (S.PHY + S.SPD + S.level), 'focus' : (S.PHY + S.INS + S.level), 'guard' : (S.WSD + S.END + S.level), 'react' : (S.WSD + S.SPD + S.level), 'psych' : (S.WSD + S.INS + S.level), 'regen' : (S.END + S.SPD + S.level), 'force' : (S.END + S.INS + S.level), 'fight' : (S.SPD + S.INS + S.level), }; var max_qi=0.0; var qi=0.0; Object.keys(MATRIX).forEach(function(energy){ max_qi += MATRIX[energy]; MATRIX[energy] *= (Math.random()*(max-min)+min); qi += MATRIX[energy]; }); MATRIX['qi'] = qi; MATRIX['max_qi'] = max_qi; return MATRIX; }, 'generateRandomEncounterStats' : function(PCHAR, PARAMS) { var sX=setup.ALIAS; var T = PCHAR.TRAITS; var M = PCHAR.METRICS; var f = T.gender==('female'||'futa'); var m = T.gender==('male'||'none'); var wt = PARAMS.wt||200; var scale = sX.pow((((M.ht+(wt/5)-(M.age/3))*(f?1.34:0.69))/72), (1.34+(f?0.16:0.016)), '-'); var scaleup = 1 * (scale + (m ? 0.016 : 0.16 ) ); var scaledown = 1 / (scale + (f ? 0.016 : 0.16 ) ); var halfup = (1+scaleup )/2; var halfdown = (1+scaledown )/2; var amazonIndex = PARAMS['amazonIndex'] || $G.WORLD.amazonIndex; var azI_root = sX.sqrt(amazonIndex, '+'); var azI_avg = (amazonIndex+azI_root)/2; var tS = { 'STR': { 'base': ((2.1*(m?4.3:1.6))+Math.max(1, ( sX.randomStat(17, 9) * either(scaleup, halfdown, halfup ) )-(M.age/ 5) )), }, 'PHY': { 'base': ((2.3*(m?2.7:1.4))+Math.max(1, ( sX.randomStat(15, 8) * either(halfup, halfup, halfdown) )-(M.age/10) )), }, 'WSD': { 'base': ((2.7*(m?1.4:1.1))+Math.max(1, ( sX.randomStat( 7, 4) * either(scaledown, halfup, halfdown) )+(M.age/ 5) )), }, 'END': { 'base': ((2.3*(m?1.2:3.9))+Math.max(1, ( sX.randomStat(11, 6) * either(scaleup, halfdown, halfup ) )+(M.age/20) )), }, 'SPD': { 'base': ((2.1*(m?2.8:1.3))+Math.max(1, ( sX.randomStat(13, 7) * either(halfup, halfdown, halfdown) )-(M.age/20) )), }, 'INS': { 'base': ((2.6*(m?1.6:1.3))+Math.max(1, ( sX.randomStat( 9, 5) * either(scaledown, halfup, halfdown) )+(M.age/10) )), }, }; tS = sX.azIScaleStats(T.gender, tS, {'BASE':{ 'STR':5, 'END':4, 'SPD':4, 'PHY':4, 'INS':3, 'WSD':3 }}); var tScale = sX.rand(0.1, 1.00+(m?-(azI_root/2):azI_avg/azI_root))+Math.min(azI_root, $G.PC.S.CALC.Cap||34); var STATS = { 'STR': tS.STR.base*sX.rand(0.34, 0.84)*tScale, 'PHY': tS.PHY.base*sX.rand(0.34, 0.84)*tScale, 'WSD': tS.WSD.base*sX.rand(0.34, 0.84)*tScale, 'END': tS.END.base*sX.rand(0.34, 0.84)*tScale, 'SPD': tS.SPD.base*sX.rand(0.34, 0.84)*tScale, 'INS': tS.INS.base*sX.rand(0.34, 0.84)*tScale, }; var S = { 'STR': { 'base': 3+STATS.STR, 'pow':0, 'PERM': { 'genes' : sX.rand(-STATS.STR/6, STATS.SPD/3), 'evolve': sX.rand(-STATS.STR/6, STATS.SPD/3), 'karma' : sX.rand(-STATS.STR/6, STATS.SPD/3), 'train' : sX.rand(-STATS.STR/6, STATS.SPD/3), 'drain' : sX.rand(-STATS.STR/6, STATS.SPD/3), 'primal' : sX.rand(-STATS.STR/6, STATS.SPD/3), }, 'TEMP':{}, '~cache': STATS.STR+10, }, 'PHY': { 'base': 3+STATS.PHY, 'pow':0, 'PERM': { 'genes' : sX.rand(-STATS.PHY/6, STATS.SPD/3), 'evolve': sX.rand(-STATS.PHY/6, STATS.SPD/3), 'karma' : sX.rand(-STATS.PHY/6, STATS.SPD/3), 'train' : sX.rand(-STATS.PHY/6, STATS.SPD/3), 'drain' : sX.rand(-STATS.PHY/6, STATS.SPD/3), 'primal' : sX.rand(-STATS.PHY/6, STATS.SPD/3), }, 'TEMP':{}, '~cache': STATS.PHY+10, }, 'WSD': { 'base': 3+STATS.WSD, 'pow':0, 'PERM': { 'genes' : sX.rand(-STATS.WSD/6, STATS.SPD/3), 'evolve': sX.rand(-STATS.WSD/6, STATS.SPD/3), 'karma' : sX.rand(-STATS.WSD/6, STATS.SPD/3), 'train' : sX.rand(-STATS.WSD/6, STATS.SPD/3), 'drain' : sX.rand(-STATS.WSD/6, STATS.SPD/3), 'primal' : sX.rand(-STATS.WSD/6, STATS.SPD/3), }, 'TEMP':{}, '~cache': STATS.WSD+10, }, 'END': { 'base': 3+STATS.END, 'pow':0, 'PERM': { 'genes' : sX.rand(-STATS.END/6, STATS.SPD/3), 'evolve': sX.rand(-STATS.END/6, STATS.SPD/3), 'karma' : sX.rand(-STATS.END/6, STATS.SPD/3), 'train' : sX.rand(-STATS.END/6, STATS.SPD/3), 'drain' : sX.rand(-STATS.END/6, STATS.SPD/3), 'primal' : sX.rand(-STATS.END/6, STATS.SPD/3), }, 'TEMP':{}, '~cache': STATS.END+10, }, 'SPD': { 'base': 3+STATS.SPD, 'pow':0, 'PERM': { 'genes' : sX.rand(-STATS.SPD/6, STATS.SPD/3), 'evolve': sX.rand(-STATS.SPD/6, STATS.SPD/3), 'karma' : sX.rand(-STATS.SPD/6, STATS.SPD/3), 'train' : sX.rand(-STATS.SPD/6, STATS.SPD/3), 'drain' : sX.rand(-STATS.SPD/6, STATS.SPD/3), 'primal' : sX.rand(-STATS.SPD/6, STATS.SPD/3), }, 'TEMP':{}, '~cache': STATS.SPD+10, }, 'INS': { 'base': 3+STATS.INS, 'pow':0, 'PERM': { 'genes' : sX.rand(-STATS.INS/6, STATS.SPD/3), 'evolve': sX.rand(-STATS.INS/6, STATS.SPD/3), 'karma' : sX.rand(-STATS.INS/6, STATS.SPD/3), 'train' : sX.rand(-STATS.INS/6, STATS.SPD/3), 'drain' : sX.rand(-STATS.INS/6, STATS.SPD/3), 'primal' : sX.rand(-STATS.INS/6, STATS.SPD/3), }, 'TEMP':{}, '~cache': STATS.INS+10, }, }; /* note: run a statRefresh() on this result before use! */ return S; }, 'generateRandomID' : function(gender, PARAM) { var sX=setup.ALIAS; var sN=setup.NAMES; /* will add age, address, and other bits later... */ gender=gender||either('male','female'); PARAM=PARAM||{}; var amazonIndex = PARAM['amazonIndex'] || $G.WORLD.amazonIndex; var azI_Ht = 0; var azI_cup = 0; var beRate = $G.WORLD.RATES.breastExpansion; var hgRate = $G.WORLD.RATES.heightGain; var LICENSE = { 'name' : sN.randomName(gender), 'age' : sX.putInBounds(sN.randomAge(), 'generateRandomID-age'), 'gender' : gender, 'cardtype' : either('ID','License','License','License'), }; switch(true) { case (gender=='female'): case (gender=='futa'): azI_Ht = amazonIndex*hgRate; azI_cup = sX.sqrt(amazonIndex, '-')*beRate; break; case (gender=='male'): case (gender=='none'): default: break; } LICENSE.genpro = ( LICENSE.gender=='female' ? (LICENSE.age<20 ? 'girl' : 'woman') : (LICENSE.age<20 ? 'boy' : 'man' ) ); LICENSE.ht = azI_Ht+((sN.randomHeight( LICENSE.gender=='female' ? 64 : 69 ))+3-Math.round(sX.sqrt(40-LICENSE.age,'+')) * 1.1); LICENSE.wt = 15+(sN.randomWeight(125+sX.sqrt(LICENSE.age,'0'), 250+LICENSE.age)*( LICENSE.gender=='male' ? 1.1 : 0.9 )) * 1.1; LICENSE.base_ht = 72; LICENSE.scale = (LICENSE.ht / LICENSE.base_ht); LICENSE.adj_wt = sX.weightScaled(LICENSE.wt, LICENSE.scale); LICENSE.bust = (gender=='male' ? -3 : sN.randomBust()+1+azI_cup ); return LICENSE; }, /* TODO: update saves by generating UIDs for any npc missing one... */ 'generateUID_fromName' : function(npc_name) { var CHAR = $G.PC; var WORLD = $G.WORLD; var uid = npc_name; var i=2; while(WORLD.NPCS[uid] || CHAR.SLAVES[uid] || CHAR.ENEMIES[uid] || CHAR.LOVERS[uid] || CHAR.EXSLAVES[uid] || CHAR.FRIENDS[uid]) { uid = npc_name+' ('+ i +')'; i++; } return uid; }, 'genForSex' : function(sex, key) { key=key||'gen'; /* TODO: perhaps add variations on number of sex chromosomes? */ var SEXES={ '--':{'g':'-', 'gen':'none', 'looks':'neuter', }, 'x-':{'g':'f', 'gen':'fem', 'looks':'feminine', }, 'y-':{'g':'m', 'gen':'mas', 'looks':'masculine', }, 'xx':{'g':'f', 'gen':'female', 'looks':'female', }, 'xy':{'g':'m', 'gen':'male', 'looks':'male', }, 'vx':{'g':'f', 'gen':'female', 'looks':'female', }, 'vy':{'g':'m', 'gen':'male', 'looks':'male', }, 'vv':{'g':'?', 'gen':'???', 'looks':'???', }, 'zx':{'g':'h', 'gen':'herm', 'looks':'female', }, 'zy':{'g':'d', 'gen':'dickgirl', 'looks':'female', }, /* option to change terms? */ 'zz':{'g':'h', 'gen':'hyperfuta', 'looks':'hyper', }, 'vz':{'g':'h', 'gen':'futa', 'looks':'female', }, 'wx':{'g':'a', 'gen':'amazon', 'looks':'amazon', }, 'wy':{'g':'?', 'gen':'???', 'looks':'monstrous', }, 'wv':{'g':'a', 'gen':'amazon', 'looks':'amazon', }, 'wz':{'g':'z', 'gen':'futazon', 'looks':'futazon', }, 'ww':{'g':'g', 'gen':'goddess', 'looks':'goddess', }, }; return SEXES[sex][key]; }, 'getAisleName' : function(aisle) { var dept = aisle.substr(0,3); return setup.AISLES[dept].AISLES[aisle].name.toLowerCase(); }, 'getBalanceDark' : function(CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('getBalanceDark - NO CHAR!'); } return CHAR.MATRIX.dark / (CHAR.MATRIX.light + CHAR.MATRIX.dark); }, 'getBalanceLight' : function(CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('getBalanceLight - NO CHAR!'); } return CHAR.MATRIX.light / (CHAR.MATRIX.light + CHAR.MATRIX.dark); }, 'getDeptName' : function(aisle) { var dept = aisle.substr(0,3); return setup.AISLES[dept].name.toLowerCase(); }, 'getDynamic' : function(obj) { if(typeof obj=='function') { return obj(); } else { return obj; } }, 'getItem' : function(item_id) { return setup.DATA.ITEMS[item_id]; }, 'getKarmicBalance' : function(CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('getKarmicBalance - NO CHAR!'); } return (CHAR.MATRIX.light - CHAR.MATRIX.dark) / (CHAR.MATRIX.light + CHAR.MATRIX.dark); }, 'getName' : function(CHOICES, nomatch, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('getName - NO CHAR!'); } nomatch=nomatch||'...'; /* return the first name-key matched */ var name=sX.firstVal(CHOICES, CHAR.NAMES); if(!name) { name=nomatch; } return name; }, 'getResource' : function(res, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('getResource - NO CHAR!'); } /* sX.statGet(stat, secAlias, CHAR); */ var S = sX.statGet('all', 'current', CHAR); var style = ''; var digits = 1; var max = null; var pre = ''; var post = ''; var rmr = 3500; switch(res) { case 'kcal': max = rmr; digits=0; break; case 'protein': max = rmr/8; digits=2; post='g'; break; case 'sugar': max = rmr/10; digits=2; post='g'; break; case 'money': digits=2; pre='$'; break; case 'petro': max = 14.0; break; case 'regen': case 'react': case 'metab': case 'power': case 'fight': case 'guard': case 'vital': case 'tough': case 'force': case 'aware': case 'train': case 'psych': case 'vigor': case 'focus': case 'skill': max = sX.maxResource(res, CHAR); break; case 'light': max = S.light_well; break; case 'dark' : max = S.dark_well; break; case 'qi': max = S.max_qi; break; default: break; } if(max) { switch(true) { case (CHAR.MATRIX[res]/max >= 1.6 ): style='overcharged'; break; case (CHAR.MATRIX[res]/max >= 1.1 ): style='overflowing'; break; case (CHAR.MATRIX[res]/max >= 1.0 ): style='full'; break; case (CHAR.MATRIX[res]/max >= 0.8 ): style='high'; break; case (CHAR.MATRIX[res]/max <= 0.1 ): style='critical'; break; case (CHAR.MATRIX[res]/max <= 0.4 ): style='low'; break; default: style='normal'; break; } } /* bars are scaled to the natural logarithm, base e */ var pct= sX.logX(2.71828, CHAR.MATRIX[res]/max*30, '0')*25; var val = (CHAR.MATRIX[res]).toLocaleString(undefined, {minimumFractionDigits: digits, maximumFractionDigits: digits}); if(isNaN(CHAR.MATRIX[res])) { try { $G.ERRORS.NaN['char-'+res]= ($G.ERRORS.NaN['char-'+res]+1)||1; } catch(e) {} } if(max) { return "<div class='meter "+ style +"' title='"+ style +"' value='"+ pre + val + post +"'><span class='label'>"+ res +"</span><span class='value'>"+ pre + val + post +"</span><div class='bar' style='width:"+ pct +"%;'></div></div>" } else { return "<div class='meter "+ style +"' title='"+ style +"' value='"+ pre + val + post +"'><span class='label'>"+ res +"</span><span class='value'>"+ pre + val + post +"</span><div class='bar'></div></div>" } }, 'getTotalKarma' : function(CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('getTotalKarma - NO CHAR!'); } return CHAR.MATRIX.light + CHAR.MATRIX.dark; }, 'gym_getMuscles_forWorkout' : function(workout) { var sX=setup.ALIAS; var sW=setup.WORKOUTS; var sB=setup.BODY; var MUSCLES = {}; Object.keys(sW[workout].MATRIX).forEach(function(key) { /* only list muscles affected by this workout */ if(('muscle'==sB[key].type)&&(sW[workout].MATRIX[key])&&(sW[workout].MATRIX[key]>0)) { MUSCLES[key] = sW[workout].MATRIX[key] / sW[workout].total; } }); /* NOTE: due to ECMAScript property sorting limitations, this RETURNS a sorted ARRAY of KEYS ONLY, not a sorted KV-Object */ return sX.kvSort(MUSCLES); }, 'gym_getWorkouts_forMuscle' : function(muscle) { var sX=setup.ALIAS; var WORKOUTS = {}; Object.keys(setup.WORKOUTS).forEach(function(key) { /* only list the functional areas of the gym - which means rep-based workouts only for now */ if(('reps'==setup.WORKOUTS[key].units)&&(setup.WORKOUTS[key].MATRIX[muscle])&&(setup.WORKOUTS[key].MATRIX[muscle]>0)) { WORKOUTS[key] = setup.WORKOUTS[key].MATRIX[muscle] / setup.WORKOUTS[key].total; } }); /* NOTE: due to ECMAScript property sorting limitations, this RETURNS a sorted ARRAY of KEYS ONLY, not a sorted KV-Object */ return sX.kvSort(WORKOUTS); }, 'gym_listLoadsForWorkout' : function(workout, CHAR) { var sX=setup.ALIAS; var sW=setup.WORKOUTS; if(!CHAR) { sX.debugLog('gym_listLoadsForWorkout - NO CHAR!'); } /* sX.statGet(stat, secAlias, CHAR); */ var S = sX.statGet('all', 'current', CHAR); var ssMul = sX.statGet('STR', 'mult', CHAR); var bwt = sX.weightGet('body', CHAR)*0.99; var mus = sX.weightGet('muscle', CHAR); workout=workout||_workout; var hbw = ((bwt-(mus*3)) * sW[workout].pbw); var out = ''; if(!sX.canDoLift(workout, CHAR, true)['canDo']) { return "<ul class='workouts'><li><bbbbb>(Your muscles are too weak to perform this workout right now...)</bbbbb></li></ul>"; } var lift = ssMul*(Math.min(CHAR.MATRIX.power, S.STR + S.SPD) + mus-hbw) * sW[workout].pls; var units = sW[workout].units; var LOADS = {}; switch(units) { case 'challenges': LOADS = { }; break; case 'positions': LOADS = { }; break; case 'workouts': LOADS = { }; break; case 'min': LOADS={ 'WORK STR' :{ 'lnk':( (settings.debugModeInfo ? '[STR+] ' : '')+ '<bb>MAX RESISTANCE </bb><ss>'+ (settings.debugModeInfo ? ' [1-2 reps @ 100%]' : '')+' (' + sX.formatWeight(lift*0.98)+')</ss>'), 'load':'max', 'weight':(lift*0.97), 'bonus':'STR', 'units': 0, }, 'WORK PHY' :{ 'lnk':( (settings.debugModeInfo ? '[PHY+] ' : '')+ '<bb>ADD ISOMETRIC RESISTANCE </bb><ss>'+ (settings.debugModeInfo ? ' [6-12 reps @ 65%]' : '')+' (' + sX.formatWeight(lift*0.64)+')</ss>'), 'load':'slow', 'weight':(lift*0.77), 'bonus':'PHY', 'units': 0, }, 'WORK WSD' :{ 'lnk':( (settings.debugModeInfo ? '[WSD+] ' : '')+ '<bb>WARM UP </bb><ss>'+ (settings.debugModeInfo ? ' [10 reps @ 25%]' : '')+' (' + sX.formatWeight(lift*0.24)+')</ss>'), 'load':'min', 'weight':(lift*0.24), 'bonus':'WSD', 'units': 0, }, 'WORK END' :{ 'lnk':( (settings.debugModeInfo ? '[END+] ' : '')+ '<bb>WORK TO EXHAUSTION </bb><ss>'+ (settings.debugModeInfo ? ' [30+ reps @ 50%]' : '')+' (' + sX.formatWeight(lift*0.49)+')</ss>'), 'load':'light', 'weight':(lift*0.48), 'bonus':'END', 'units': 0, }, 'WORK SPD' :{ 'lnk':( (settings.debugModeInfo ? '[SPD+] ' : '')+ '<bb>HIGH INTENSITY </bb><ss>'+ (settings.debugModeInfo ? ' [4-6 reps @ 85%]' : '')+' (' + sX.formatWeight(lift*0.84)+')</ss>'), 'load':'heavy', 'weight':(lift*0.84), 'bonus':'SPD', 'units': 0, }, 'WORK INS' :{ 'lnk':( (settings.debugModeInfo ? '[INS+] ' : '')+ '<bb>PACE YOURSELF </bb><ss>'+ (settings.debugModeInfo ? ' [8-20 reps @ 75%]' : '')+' (' + sX.formatWeight(lift*0.74)+')</ss>'), 'load':'normal', 'weight':(lift*0.69), 'bonus':'INS', 'units': 0, }, }; /* not ready until we switch from reps to minutes */ LOADS={}; break; case 'reps': /* units=0 == auto */ LOADS={ 'WORK STR' :{ 'lnk':( (settings.debugModeInfo ? '[STR+] ' : '')+ '<bb>GO FOR MAX LIFT </bb><ss>'+ (settings.debugModeInfo ? ' [1-2 reps @ 100%]' : '')+' (' + sX.formatWeight(lift*0.98)+')</ss>'), 'load':'max', 'weight':(lift*0.97), 'bonus':'STR', 'units': 0, }, 'WORK PHY' :{ 'lnk':( (settings.debugModeInfo ? '[PHY+] ' : '')+ '<bb>SLOW REPS/MAX FLEX </bb><ss>'+ (settings.debugModeInfo ? ' [6-12 reps @ 65%]' : '')+' (' + sX.formatWeight(lift*0.64)+')</ss>'), 'load':'slow', 'weight':(lift*0.77), 'bonus':'PHY', 'units': 0, }, 'WORK WSD' :{ 'lnk':( (settings.debugModeInfo ? '[WSD+] ' : '')+ '<bb>WARM UP/LIGHT TONE </bb><ss>'+ (settings.debugModeInfo ? ' [10 reps @ 25%]' : '')+' (' + sX.formatWeight(lift*0.24)+')</ss>'), 'load':'min', 'weight':(lift*0.24), 'bonus':'WSD', 'units':10, }, 'WORK END' :{ 'lnk':( (settings.debugModeInfo ? '[END+] ' : '')+ '<bb>BURNOUT/MAX REPS </bb><ss>'+ (settings.debugModeInfo ? ' [30+ reps @ 50%]' : '')+' (' + sX.formatWeight(lift*0.49)+')</ss>'), 'load':'light', 'weight':(lift*0.48), 'bonus':'END', 'units': 0, }, 'WORK SPD' :{ 'lnk':( (settings.debugModeInfo ? '[SPD+] ' : '')+ '<bb>WORK HEAVY/FAST </bb><ss>'+ (settings.debugModeInfo ? ' [4-6 reps @ 85%]' : '')+' (' + sX.formatWeight(lift*0.84)+')</ss>'), 'load':'heavy', 'weight':(lift*0.84), 'bonus':'SPD', 'units': 0, }, 'WORK INS' :{ 'lnk':( (settings.debugModeInfo ? '[INS+] ' : '')+ '<bb>PROPER TECHNIQUE </bb><ss>'+ (settings.debugModeInfo ? ' [8-20 reps @ 75%]' : '')+' (' + sX.formatWeight(lift*0.74)+')</ss>'), 'load':'normal', 'weight':(lift*0.69), 'bonus':'INS', 'units': 0, }, }; break; default: /* workout type/area not programmed */ break; } var i=0; if(Object.keys(LOADS).length) { Object.keys(LOADS).forEach(function(key) { i++; out += " <li class='keypress' key='"+ i +"'><<link '"+ LOADS[key].lnk +"'>><<set " +" _load='"+ LOADS[key].load +"'; " +" _weight="+ LOADS[key].weight +"; " +" _bonus='"+ LOADS[key].bonus +"'; " +" _reps="+ LOADS[key].reps +"; " +">><<print setup.ALIAS.reloadPassage(); >><</link>></li>"; }); } else { out += " <li><bbbbb>(Area closed for renovation)</bbbbb></li>"; } return "<ul class='workouts'>"+ out +"</ul>"; }, 'gym_listMuscles_forWorkout' : function(workout) { var sX=setup.ALIAS; var out = ''; var val = 0; var MUSCLES = sX.gym_getMuscles_forWorkout(workout); MUSCLES.forEach(function(key) { val = sX.formatAsPct(setup.WORKOUTS[workout].MATRIX[key] / setup.WORKOUTS[workout].total, 1); out += "<tr><td><<topic '"+ setup.BODY[key].name +"'>></td><td>"+ val +"</td></tr>"; }); return "<table class='k-v'>"+ out +"</table>"; }, 'gym_listWorkoutsForArea' : function(gym_area, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('gym_listWorkoutsForArea - NO CHAR!'); } var out="<ul class='workouts'>"; var TEST = {}; Object.keys(setup.WORKOUTS).forEach(function(workout) { if(gym_area==setup.WORKOUTS[workout].area) { /* only show workouts for uninjured regions */ TEST = sX.canDoLift(workout, CHAR); if(TEST.canDo) { out += " <li><<link '"+ workout +"'>><<set _workout='"+ workout +"'>><<print setup.ALIAS.reloadPassage(); >><</link>></li>"; } else { out += " <li><span class='disabled' title='You have too much "+ TEST.reason +" to perform this exercise safely, give yourself time to heal before trying this again...'><a>"+ workout +"</a></span></li>"; } } }); out+="</ul>"; return out; }, 'gym_listWorkouts_forMuscle' : function(muscle) { var sX=setup.ALIAS; var out = ''; var val = 0; var WORKOUTS = sX.gym_getWorkouts_forMuscle(muscle); WORKOUTS.forEach(function(key) { val = sX.formatAsPct(setup.WORKOUTS[key].MATRIX[muscle] / setup.WORKOUTS[key].total, 1); out += "<tr><td><<topic '"+ key +"'>></td><td>"+ val +"</td></tr>"; }); return "<table class='k-v'>"+ out +"</table>"; }, 'hlObj_addRootNodes' : function(OBJ) { var NODES=['_','$']; for(var i=0; i<26; i++) { NODES.push(String.fromCharCode(i+65)); } NODES.forEach(function(node) { if('undefined'==typeof(OBJ[node])) { OBJ[node]={}; } }); }, 'itemCard' : function(item_id) { var sX=setup.ALIAS; var ITEM = setup.DATA.ITEMS[item_id]; return " <div class='item"+(settings.lod_energyMatrix ? '-matrix' : '')+' '+ _dept +" "+ _aisle +" glass' tabindex='0'> <div class='top_bar glass'><h4 class='item_name'>"+ ITEM.name +"</h4></div> <div class='info glass'> <div class='icon-frame'> <div><span class='uses'>Pack: "+ ITEM.uses +"</span></div> <div><img class='icon glass' /></div> <div><span class='cost'>$ " +ITEM.cost.toLocaleString(undefined, {minimumFractionDigits: 2, maximumFractionDigits: 2}) +"</span></div> </div> <div class='detail-pane'> <div class='details'> <span>Calories:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.kcal) +"</span> <span>Protein:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.protein) +"g</span> <span>Sugar:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.sugar) +"g</span> "+(settings.lod_energyMatrix ? " <span>regen:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.regen) +"</span> <span>react:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.react) +"</span> <span>metab:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.metab) +"</span> <span>power:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.power) +"</span> <span>fight:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.fight) +"</span> <span>guard:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.guard) +"</span> <span>vital:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.vital) +"</span> <span>tough:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.tough) +"</span> <span>force:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.force) +"</span> <span>aware:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.aware) +"</span> <span>train:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.train) +"</span> <span>psych:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.psych) +"</span> <span>vigor:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.vigor) +"</span> <span>focus:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.focus) +"</span> <span>skill:<br/>"+ sX.formatMatrixValue(ITEM.MATRIX.skill) +"</span> " : '')+" </div> </div> </div> <div class='bottom_bar glass'> <span class='link'> <<link '[BUY]' >> <<run setup.ALIAS.buyItem( '" + item_id + "', $G.PC);>> <<replace '#feedback'>><<include 'FEEDBACK'>><</replace>> <</link>> </span> <span class='link'> <<link '[STEAL]'>> <<run setup.ALIAS.stealItem('" + item_id + "', $G.PC);>> <<replace '#feedback'>><<include 'FEEDBACK'>><</replace>> <</link>> </span> </div> </div> "; }, 'karmaAdd' : function(amt, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('karmaAdd - NO CHAR!'); } var E = CHAR.MATRIX; if(isNaN(E.light)) { E.light=0; } if(isNaN(E.dark)) { E.dark=0; } var lightBal = sX.getBalanceLight(CHAR); var darkBal = sX.getBalanceDark(CHAR); E.light += amt * lightBal; E.dark += amt * darkBal; }, 'karmaSpend' : function(amt, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('karmaSpend - NO CHAR!'); } if(amt>sX.getTotalKarma(CHAR)) { return false; } sX.karmaAdd(-sX.logX(10, amt, '-'), CHAR); return true; }, 'karma_weightChange' : function(PARAMS) { PARAMS=PARAMS||{ 'dir' : 'raise', 'amt' : 1, 'cost' : 0, 'type' : 'Karma', 'label' : '?', 'hint' : '', }; alert('do something!'); }, 'karmic_link' : function(stat, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('karmic_link - NO CHAR!'); } var kLink = ''; var cost = 0; var type = ''; var label = stat; var amt = 1; var hint = ''; var new_ui = false; var callback = null; var ARGS = []; var PARAMS = { 'CHAR': CHAR, }; var S = sX.statGet('all', 'karma', CHAR); switch(stat) { case 'STR': case 'PHY': case 'WSD': case 'END': case 'SPD': case 'INS': cost = Math.round(sX.xp_curve( /* ( lv, +mod1, *rate1, ^exp, *rate2, +mod2) */ S[stat]+S['capacity'], 1+0.00, 0.6, 2.4, 16, 0 )); PARAMS.label = label; PARAMS.cost = cost; PARAMS.type = 'STATS'; PARAMS.callback='statRefresh'; PARAMS.ARGS=[CHAR]; new_ui = true; break; case 'cup': stat = 'bust'; case 'bust': cost = Math.round(sX.xp_curve( /* ( lv, +mod1, *rate1, ^exp, *rate2, +mod2) */ CHAR.METRICS[stat], 1+3.69, 3.54, 2.032, 3.54, -1900 )); type = 'METRICS'; break; case 'height': stat = 'ht'; case 'ht': cost = Math.round(sX.xp_curve( /* ( lv, +mod1, *rate1, ^exp, *rate2, +mod2) */ CHAR.METRICS[stat], -12, 1/24, 10, 1/24, 16 )); type = 'METRICS'; hint = ("Metric"==settings.units ? '(2.54 cm)' : ''); break; case 'weight': stat = 'wt'; case 'wt': cost = Math.round(sX.xp_curve( /* ( lv, +mod1, *rate1, ^exp, *rate2, +mod2) */ CHAR.METRICS[stat], 0, 1/42, 3, 6, 30 )); PARAMS.label = label; PARAMS.cost = cost; PARAMS.type = 'METRICS'; PARAMS.amt = 5; PARAMS.hint = ("Metric"==settings.units ? '(2.27 kg)' : ''); new_ui = true; break; /* not a karmically linkable stat */ default: return label; } /* TODO: finish new karma system and re-enable upgrades */ cost = Number.POSITIVE_INFINITY; /* not enough karma to link stat */ if(cost>sX.getTotalKarma(CHAR)) { return "<span title='"+ cost +" karma'>" + label + "</span>"; } if(new_ui) { kLink += "<span title='"+ cost +" karma'><<link '"+ label +"'>>"; kLink += "<<set _PARAMS = "+ PARAMS +">>"; kLink += "<<run setup.ALIAS.dialog_show('karma_spend', _PARAMS);>>"; kLink += "<</link>></span>"; } else { kLink += "<span title='"+ cost +" karma'><<link '"+ label +"'>>"; kLink += "<<set _cost = "+ cost +" >>"; kLink += "<<set _stat = '"+ stat +"'>>"; kLink += "<<set _label = '"+ label +"'>>"; kLink += "<<set _type = '"+ type +"'>>"; kLink += "<<set _amt = "+ amt +" >>"; kLink += "<<set _hint = '"+ hint +"'>>"; kLink += "<<run setup.ALIAS.menu_showAs('SPEND KARMA');>>"; kLink += "<</link>></span>"; } return kLink; }, 'levelAdd' : function(lv, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('levelAdd - NO CHAR!'); } /* sX.statGet(stat, secAlias, CHAR); */ var S = sX.statGet('all', 'base', CHAR); /* sX.statGrow(stat, secAlias, trainAmt, CHAR); */ sX.statGrow('STR', 'train', lv*(S.STR/S.level), CHAR); sX.statGrow('PHY', 'train', lv*(S.PHY/S.level), CHAR); sX.statGrow('WSD', 'train', lv*(S.WSD/S.level), CHAR); sX.statGrow('END', 'train', lv*(S.END/S.level), CHAR); sX.statGrow('SPD', 'train', lv*(S.SPD/S.level), CHAR); sX.statGrow('INS', 'train', lv*(S.INS/S.level), CHAR); sX.qiFlow(0.034, 1, CHAR); sX.do_status_update(CHAR); }, 'lightAdd' : function(amt, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('lightAdd - NO CHAR!'); } CHAR.MATRIX.light += amt; CHAR.MATRIX.dark += amt * -0.5; }, 'lightShift' : function(amt, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('lightShift - NO CHAR!'); } CHAR.MATRIX.light += amt; CHAR.MATRIX.dark -= amt; if(CHAR.MATRIX.dark<0) { CHAR.MATRIX.light += CHAR.MATRIX.dark; CHAR.MATRIX.dark = 0; } }, 'lightSpend' : function(amt, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('lightSpend - NO CHAR!'); } sX.karmaAdd(-sX.logX(10, amt, '-'), CHAR); sX.lightShift(amt*3, CHAR); }, 'listConditions' : function(CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('listConditions - NO CHAR!'); } var out = ''; var ct = 0; Object.keys(CHAR.STATUS).forEach(function(cond) { if(CHAR.STATUS[cond]) { out += "<span class='cond glass'>"+ CHAR.STATUS[cond] +"</span>"; ct++; } }); if(ct<1) { out += "<span class='cond'>normal</span>"; } return "<div class='STATUS'>"+ out +"</div>"; }, 'listItem_forSale' : function(item) { /* TODO: work out better shopping system... with theft-events */ }, 'listMuscleStatus' : function(CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('listMuscleStatus - NO CHAR!'); } /* sX.statGet(stat, secAlias, CHAR); */ var S = sX.statGet('all', 'current', CHAR); var table = "<tr> <td> <small>(tone/potential)</small> </td> <td> ... </td> <td> tone </td> <td> -damage </td> <td> -fatigue </td> <td> =condition </td> <td> /potential </td> </tr>"; var cap = S.capacity; var trainVal = 0.0; var dmgVal = 0.0; var dmgCap = 0.0; var condLv = ''; var ftgVal = 0.0; var ftgCap = 0.0; var dmgLv = ''; var condVal = 0.0; var condCap = 0.0; var ftgLv = ''; var condPct = 0.0; Object.keys(CHAR.BODY).forEach(function(part) { trainVal = (CHAR.BODY[part].train||0); dmgVal = (CHAR.BODY[part].damage||0)*S.difficulty_level; dmgCap = (trainVal-(dmgVal/cap)); ftgVal = (CHAR.BODY[part].fatigue||0)*S.difficulty_level; ftgCap = (trainVal-(ftgVal/cap)); condVal = (trainVal*cap)-dmgVal-ftgVal; condCap = condVal/cap; condPct = condVal/(cap*cap); if(setup.BODY[part].type=='muscle') { switch(true) { case (condVal<0.0): condLv='failing'; break; case (condVal<1.0): condLv='critical'; break; case (condCap<1.0): condLv='low'; break; default: condLv=''; break; } switch(true) { case ((trainVal*cap-dmgVal)<0.0): dmgLv='failing'; break; case ((trainVal*cap-dmgVal)<cap/2): dmgLv='critical'; break; case (dmgCap<0.7): dmgLv='high'; break; default: dmgLv=''; break; } switch(true) { case ((trainVal*cap-ftgVal)<0.0): ftgLv='failing'; break; case ((trainVal*cap-ftgVal)<cap/2): ftgLv='critical'; break; case (ftgCap<0.7): ftgLv='high'; break; default: ftgLv=''; break; } table += "<tr> <td style='width: 99%;'>"+ sX.powerMeter(trainVal, cap) +" </td> <td>"+setup.BODY[part].name+" </td> <td>"+(trainVal*cap).toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1})+" </td> <td class='damage "+ dmgLv +"' title='"+ dmgLv +"'>"+dmgVal.toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1})+" </td> <td class='fatigue "+ ftgLv +"' title='"+ ftgLv +"'>"+ftgVal.toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1})+" </td> <td class='cond "+ condLv +"' title='"+ condLv +"'>"+(condVal).toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1})+" </td> <td> / "+(sX.pow(cap, 2, '-')).toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1})+" </td> </tr>"; } }); return "<table class='workout'>"+ table +"</table>"; }, 'listPowers' : function(CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('listPowers - NO CHAR!'); } /* sX.statGet(stat, secAlias, CHAR); */ var S = sX.statGet('all', 'current', CHAR); var cal = S.caliber; var cap = S.capacity; var powersList = ''; var POWERS = sX.powers_getKnown(CHAR); Object.keys(POWERS).forEach(function(power) { powersList += "<tr><td style='width: 34vw'>"+ sX.powerMeter(sX.powers_getPowerRank(power, CHAR), cal, cal) +"</td><td style='white-space: nowrap;'>"+POWERS[power].label+"</td></tr>"; }); return ( ''!==powersList ? "<p><table>"+ powersList +"</table></p>" : "You haven't discovered any powers yet... (also, they haven't been implemented), but if you had some, they'd use a really cool meter like this one: <p><table><tr><td style='width: 34vw'>"+ sX.powerMeter(sX.rand(1, cal), cal) +"</td><td style='white-space: nowrap;'>sample power: x ("+ either('stolen', 'absorbed', 'copied', 'learned', 'taken') +" from: "+ setup.NAMES.randomName() +")</td></tr></table></p>" ); }, 'listPowersSimple' : function(CHAR) { var sX=setup.ALIAS; var powersList = ''; var POWERS = sX.powers_getKnown(CHAR); Object.keys(POWERS).forEach(function(power) { powersList += "<li class=\"power\"><span>"+ POWERS[power].label +': </span><span class=\"r\">'+ sX.powers_getPowerRank(power, CHAR) +"</span></li>"; }); return "<ul>"+powersList+"</ul>"; }, 'listStats' : function() { return { 'STR':'Strength', 'PHY':'Physique', 'WSD':'Wisdom', 'END':'Endurance', 'SPD':'Speed', 'INS':'Instinct', }; }, 'location_discover' : function(locName, PASSAGE) { var Pl=$G.WORLD.PLACES; PASSAGE=PASSAGE||locName; Pl[locName] = Pl[locName]||{ 'name':locName, 'PASSAGE':PASSAGE, 'visits':0, }; }, 'location_known' : function(locName) { return ($G.WORLD.PLACES[locName]||$G.PC.PLACES[locName]); }, 'lootQty' : function(CHAR, odds, xtraChances) { var sX=setup.ALIAS; odds=odds||0.34; xtraChances=xtraChances||0; var diff=(($G.PC.NAMES===CHAR.NAMES) ? sX.worldVarGet('game.difficulty.level', 1.0) : 1.0); var cal = CHAR.S.CALC.Cal||1; var mag = CHAR.S.CALC.Mag||1; var rolls = (xtraChances+mag-1); var avgChance = (odds+(cal/mag/100)) /diff; var qty=0; for(var i=0; i<rolls; i++) { if(Math.random()<avgChance) { qty++; } } return qty; }, 'maxHours' : function(action_type, activity, level, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('maxHours - NO CHAR!'); } var ACT_MATRIX = setup.ACTIONS[action_type][activity].MATRIX; level=level||1.0; var hrs = Number.MAX_VALUE; Object.keys(ACT_MATRIX).forEach(function(resource) { if(typeof CHAR.MATRIX[resource] === 'undefined') { CHAR.MATRIX[resource]=0; } if(ACT_MATRIX[resource]<0) { switch(resource) { /* ignore these: */ case 'kcal': case 'protein': case 'sugar': break; default: hrs = Math.min( hrs, ((CHAR.MATRIX[resource]/(-ACT_MATRIX[resource])) / level) ); break; } } if(isNaN(ACT_MATRIX[resource])) { try { $G.ERRORS.NaN['act-'+resource]= ($G.ERRORS.NaN['act-'+resource]+1)||1; } catch(e) {} } }); return hrs; }, 'maxResource' : function(res, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('maxResource - NO CHAR!'); } /* sX.statGet(stat, secAlias, CHAR); */ var S = sX.statGet('all', 'current', CHAR); var maxRes = null; switch(res) { case 'vigor': maxRes = (S.STR + S.PHY); break; case 'train': maxRes = (S.STR + S.WSD); break; case 'tough': maxRes = (S.STR + S.END); break; case 'power': maxRes = (S.STR + S.SPD); break; case 'skill': maxRes = (S.STR + S.INS); break; case 'aware': maxRes = (S.PHY + S.WSD); break; case 'vital': maxRes = (S.PHY + S.END); break; case 'metab': maxRes = (S.PHY + S.SPD); break; case 'focus': maxRes = (S.PHY + S.INS); break; case 'guard': maxRes = (S.WSD + S.END); break; case 'react': maxRes = (S.WSD + S.SPD); break; case 'psych': maxRes = (S.WSD + S.INS); break; case 'regen': maxRes = (S.END + S.SPD); break; case 'force': maxRes = (S.END + S.INS); break; case 'fight': maxRes = (S.SPD + S.INS); break; default: break; } return maxRes; }, 'metricCalc' : function(metricAlias, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('metricCalc - NO CHAR!'); } /* sX.statGet(stat, secAlias, CHAR); */ var S = sX.statGet('all', 'current', CHAR); if(!CHAR.BODY) { CHAR.BODY=sX.new_BODY(1, S.capacity); sX.regenerateBody(0.0001, CHAR); } var cap=S.capacity; var cal=S.caliber; var mag=S.magnitude; var bodyfat=CHAR.METRICS.bodyfat; var M=CHAR.M; var MET=null; var MP=null; var WT=M.WEIGHT.SCALED; var T=CHAR.TRAITS; var B=CHAR.BODY; var min=0; var base=0; var stat_mod=0; var gen_mod=0; var mod_rate=1; var wt_mod=0; var fat_mod=0; var musc_mod=0; var tone_mod=0; var tone_mod_L=0; var tone_mod_R=0; var oil_mod=0; var secName=''; var calc=0; var wt = sX.weightGet('base', CHAR); var ht = CHAR.METRICS.ht; var bust = CHAR.METRICS.bust; switch(metricAlias) { case 'left_bicep': case 'right_bicep': case 'bicep' : secName='BICEP'; MET=M[secName]; MP=MET.PERM; min = (MET.min || 3.00); base = (MET.base || 0.69); mod_rate = (MET.rate || 1.00); mod_rate*= 1.00; tone_mod_L = (0.34*B.LeftBi.train ) + (0.16*B.LeftTri.train ); tone_mod_R = (0.34*B.RightBi.train) + (0.16*B.RightTri.train); switch(metricAlias) { case 'left_bicep': tone_mod = tone_mod_L /S.difficulty_level; break; case 'right_bicep': tone_mod = tone_mod_R /S.difficulty_level; break; case 'bicep': tone_mod = (tone_mod_L+tone_mod_R)/2 /S.difficulty_level; break; } MP.tone = tone_mod; MP.racegen = gen_mod = (T.gender=='male' ? 2: 0); MP.wt = wt_mod = (wt /90) +(bodyfat/30); MP.muscle1 = musc_mod = ((WT.muscle||0)-30)/45; MP.muscle2 = Math.max(0, musc_mod); MP.muscle3 = Math.max(0, musc_mod); MP.fat1 = fat_mod = ((WT.fat||0)-30)/90; MP.fat2 = Math.max(0, fat_mod); MP.stat = stat_mod = sX.cbrt(S.STR/2.0, '-') +sX.cbrt(S.PHY/4.0, '-') +sX.cbrt(S.END/5.0, '-'); MP.oil = oil_mod = sX.forceInRange(-cap, MP.oil, cap); break; case 'quads' : secName='QUADS'; MET=M[secName]; MP=MET.PERM; min = (MET.min || 9.00); base = (MET.base || 3.40); mod_rate = (MET.rate || 1.00); mod_rate*= 0.84; MP.tone = tone_mod = (0.69*B.Quads.train) + (0.34*B.Hams.train) /S.difficulty_level; MP.racegen = gen_mod = (T.gender=='male' ? -2: 0); MP.wt = wt_mod = (wt /42) +(bodyfat/20); MP.muscle1 = musc_mod = ((WT.muscle||0)-30)/30; MP.muscle2 = Math.max(0, musc_mod); MP.muscle3 = Math.max(0, musc_mod); MP.fat1 = fat_mod = ((WT.fat||0)-30)/60; MP.fat2 = Math.max(0, fat_mod); MP.stat = stat_mod = sX.cbrt(S.STR/1.0, '-') +sX.cbrt(S.PHY/2.0, '-') +sX.cbrt(S.END/4.0, '-'); MP.oil = oil_mod = sX.forceInRange(-cap, MP.oil, cap); break; case 'chest' : secName='CHEST'; MET=M[secName]; MP=MET.PERM; min = (MET.min || 14.00); base = (MET.base || 18.00); mod_rate = (MET.rate || 1.00); mod_rate*= 1.00; MP.tone = tone_mod = (0.42*B.Lats.train) + (0.34*B.Pecs.train) /S.difficulty_level; MP.racegen = gen_mod = (T.gender=='male' ? 4: 0); MP.wt = wt_mod = (wt/120) +(bodyfat/60); MP.stat = stat_mod = sX.cbrt(S.STR/1.5, '-') +sX.cbrt(S.PHY/5.0, '-') +sX.cbrt(S.END/7.5, '-'); MP.oil = oil_mod = sX.forceInRange(-cap, MP.oil, cap); break; case 'waist' : secName='WAIST'; MET=M[secName]; MP=MET.PERM; min = (MET.min || 11.00); base = (MET.base || 8.60); mod_rate = (MET.rate || 1.00); mod_rate*= 1.34; MP.tone = tone_mod = (0.21*B.Abs.train) + (0.06*B.LoBack.train) /S.difficulty_level; MP.racegen = gen_mod = (T.gender=='male' ? 5: 0); MP.wt = wt_mod = ((wt-ht)/72 ) +(bodyfat/6); MP.fat1 = fat_mod = ((WT.fat||0)-30)/36; MP.fat2 = Math.max(0, fat_mod); MP.fat3 = Math.max(0, fat_mod); MP.fat4 = Math.max(0, fat_mod); MP.fat5 = Math.max(0, fat_mod); MP.fat6 = Math.max(0, fat_mod); MP.muscle1 = musc_mod = ((WT.muscle||0)-45)/90; MP.muscle2 = Math.max(0, musc_mod); MP.stat = stat_mod = sX.cbrt(S.STR/6.0, '-') +sX.cbrt(S.PHY/3.0, '-') +sX.cbrt(S.END/4.0, '-'); MP.oil = oil_mod = sX.forceInRange(-cap, MP.oil, cap); break; case 'hips' : secName='HIPS'; MET=M[secName]; MP=MET.PERM; min = (MET.min || 10.00); base = (MET.base || 16.00); mod_rate = (MET.rate || 1.00); mod_rate*= 0.84; MP.tone = tone_mod = (0.42*B.Glutes.train) + (0.16*B.Hips.train) /S.difficulty_level; MP.racegen = gen_mod = (T.gender=='male' ? -8: 0); MP.wt = wt_mod = (wt /54) +(bodyfat/10); MP.fat1 = fat_mod = ((WT.fat||0)-20)/60; MP.fat2 = Math.max(0, fat_mod); MP.muscle1 = musc_mod = ((WT.muscle||0)-20)/75; MP.muscle2 = Math.max(0, musc_mod); MP.muscle3 = Math.max(0, musc_mod); MP.stat = stat_mod = sX.cbrt(S.STR/1.0, '-') +sX.cbrt(S.PHY/1.5, '-') +sX.cbrt(S.END/2.5, '-'); MP.oil = oil_mod = sX.forceInRange(-cap, MP.oil, cap); break; case 'pecs' : secName='PECS'; MET=M[secName]; MP=MET.PERM; min = (MET.min || 0.034); base = (MET.base || -1.120); mod_rate = (MET.rate || 1.000); mod_rate*= 0.160; MP.tone = tone_mod = (0.084*B.Pecs.train) /S.difficulty_level; MP.racegen = gen_mod = 0; MP.wt = wt_mod = 0; MP.muscle1 = musc_mod = ((WT.muscle||0)-30)/60; MP.stat = stat_mod = sX.cbrt(S.STR/1.6, '-') +sX.cbrt(S.PHY/3.4, '-') +sX.cbrt(S.END/6.9, '-'); MP.oil = oil_mod = sX.forceInRange(-cap, MP.oil, cap); break; case 'forearm' : secName='FOREARM'; MET=M[secName]; MP=MET.PERM; min = (MET.min || 1.64); base = (MET.base || 3.16); mod_rate = (MET.rate || 1.00); mod_rate*= 0.54; tone_mod_L = (0.21*B.LeftFore.train ); tone_mod_R = (0.21*B.RightFore.train); switch(metricAlias) { case 'left_forearm': tone_mod = tone_mod_L /S.difficulty_level; break; case 'right_forearm': tone_mod = tone_mod_R /S.difficulty_level; break; case 'forearm': tone_mod = (tone_mod_L+tone_mod_R)/2 /S.difficulty_level; break; } MP.tone = tone_mod; MP.racegen = gen_mod = (T.gender=='male' ? 2: -1); MP.wt = wt_mod = (wt /80) +(bodyfat/30); MP.muscle1 = musc_mod = ((WT.muscle||0)-30)/60; MP.muscle2 = Math.max(0, musc_mod); MP.stat = stat_mod = sX.cbrt(S.STR/2.4, '-') +sX.cbrt(S.PHY/4.8, '-') +sX.cbrt(S.END/7.2, '-'); MP.oil = oil_mod = sX.forceInRange(-cap, MP.oil, cap); break; case 'calf' : secName='CALF'; MET=M[secName]; MP=MET.PERM; min = (MET.min || 5.00); base = (MET.base || 6.00); mod_rate = (MET.rate || 1.00); mod_rate*= 0.72; MP.tone = tone_mod = (0.34*B.Calves.train) /S.difficulty_level; MP.racegen = gen_mod = (T.gender=='male' ? 2: 0); MP.wt = wt_mod = (wt /54) +(bodyfat/100); MP.muscle1 = musc_mod = ((WT.muscle||0)-30)/40; MP.muscle2 = Math.max(0, musc_mod); MP.stat = stat_mod = sX.cbrt(S.STR/2.0, '-') +sX.cbrt(S.PHY/3.0, '-') +sX.cbrt(S.END/6.0, '-'); MP.oil = oil_mod = sX.forceInRange(-cap, MP.oil, cap); break; case 'cup' : secName='TITS'; MET=M[secName]; MP=MET.PERM; min = (MET.min || -1.00 ); base = (MET.base || -7.00 +(bust) ); mod_rate = (MET.rate || 1.00 ); mod_rate*= 1.34; MP.tone = tone_mod = sX.cbrt(0.69*B.Pecs.train) /S.difficulty_level; MP.racegen = gen_mod = (T.gender=='male' ? -4: 0); MP.wt = wt_mod = sX.cbrt( (wt /10) +(bodyfat/3), '-' ); MP.fat1 = fat_mod = sX.cbrt(((WT.fat||0)-30)/60); MP.fat2 = Math.max(0, fat_mod); MP.fat3 = Math.max(0, fat_mod); MP.muscle1 = musc_mod = sX.cbrt(((WT.muscle||0)-30)/34); MP.stat = stat_mod = sX.sqrt( sX.sqrt(S.STR/2.0, '-') +sX.sqrt(S.PHY/5.0, '-') +sX.sqrt(S.END/3.5, '-') , '-'); MP.oil = oil_mod = sX.forceInRange(-cap*1.5, MP.oil+(M.PECS.PERM.oil), cap*1.5); MP.pecs = M.PECS['~cache']; break; /* TODO: ASS, HEIGHT */ /* TODO: COCK(LEN, GIR, URETHRA, BALLS, SHAPE/TYPE, QTY, LOAD, RELOAD, POTENCY), VAG(VAG, CERVIX, WOMB, CLIT*, BULB*, MAJORA, MINORA, URETHRA, GESTATION, FERTILITY, ...), TITS+(NIPS, lactation, hole, QTY), ASS+... */ default: /* unknown alias */ return null; break; } /* tone_mod *= mag/10; */ /* if(stat_mod>1) { stat_mod = sX.unstack(stat_mod)*2; } */ var mod_total=0; Object.keys(M[secName].PERM).forEach(function(mod) { mod_total+=M[secName].PERM[mod]; }); calc=Math.max(min, base+(mod_rate*mod_total)); /* if the data is not available for calculations, change nothing */ if(isNaN(calc)) { return CHAR.METRICS[metricAlias]; } if("cup"===metricAlias) { return sX.unstack(calc); } else { return (setup.FLAGS.DISPLAY.base_metrics ? calc : sX.scale(calc, 1, CHAR)); } }, 'metricTrain' : function(metricAlias, secAlias, trainAmt, CHAR) { var metric=''; var sec=''; /* TODO: add secAlias logic as needed... */ switch(metricAlias.toLowerCase()) { case 'bicep': metric = 'BICEP'; sec = 'PERM'; break; case 'forearm': metric = 'FOREARM'; sec = 'PERM'; break; case 'quads': metric = 'QUADS'; sec = 'PERM'; break; case 'calf': metric = 'CALF'; sec = 'PERM'; break; case 'chest': metric = 'CHEST'; sec = 'PERM'; break; case 'waist': metric = 'WAIST'; sec = 'PERM'; break; case 'hips': metric = 'HIPS'; sec = 'PERM'; break; case 'pecs': metric = 'PECS'; sec = 'PERM'; break; case 'tits': metric = 'TITS'; sec = 'PERM'; break; case 'ass': metric = 'ASS'; sec = 'PERM'; break; case 'height': metric = 'HEIGHT'; sec = 'PERM'; break; default: return false; break; } CHAR.M[metric][sec][secAlias] = (CHAR.M[metric][sec][secAlias]||0) + trainAmt; return true; }, 'metric_calcBust' : function(bust, raw) { var sX=setup.ALIAS; var uk_cup = ''; switch(true) { case (bust<0): uk_cup = 'AA'; break; case (bust>38): uk_cup = 'OMG'; break; default: uk_cup = sX.bust_UK[Math.floor(bust)]; break; } if(raw) { return "<span title='They appear to be ""+ uk_cup +" cup" ("+ sX.formatLength(bust) +"), relative to your frame/size, they are actually "+ sX.formatLength(raw) +" across.'>"+ uk_cup +"</span>"; } else { return uk_cup; } }, 'm_add' : function(met, sec, val, amt, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('m_get - NO CHAR!'); } var success = ( CHAR.M && CHAR.M[met] && CHAR.M[met][sec] && CHAR.M[met][sec][val]); CHAR.M[met][sec][val] += amt; return success; }, 'm_get' : function(met, sec, val, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('m_get - NO CHAR!'); } return (( CHAR.M && CHAR.M[met] && CHAR.M[met][sec] && CHAR.M[met][sec][val] ) ? CHAR.M[met][sec][val] : null ); }, 'm_set' : function(met, sec, val, amt, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('m_get - NO CHAR!'); } var success = ( CHAR.M && CHAR.M[met] && CHAR.M[met][sec] && CHAR.M[met][sec][val]); CHAR.M[met][sec][val] = amt; return success; }, 'navBuild' : function() { var Pl = $G.WORLD.PLACES; var PUBLIC_LOCATIONS = ['S-MART', 'GYM', 'RIVERSIDE PARK']; PUBLIC_LOCATIONS.forEach(function(pubLoc) { Pl[pubLoc] = Pl[pubLoc]||{ 'name':pubLoc, 'PASSAGE':pubLoc, 'visits':0, }; }); var CHAR_LOCATIONS = Object.keys($G.PC.PLACES); CHAR_LOCATIONS.forEach(function(charLoc) { Pl[charLoc] = Pl[charLoc]||$G.PC.PLACES[charLoc]; }); }, 'navMenu' : function() { var sX=setup.ALIAS; var Pl = $G.WORLD.PLACES; sX.navBuild(); var MENU = {}; Object.keys(Pl).forEach(function(place) { MENU[place] = place; }); return MENU; }, 'new_BODY' : function(min, max) { var sX=setup.ALIAS; var BODY={}; Object.keys(setup.BODY).forEach(function(key) { BODY[key]={ 'train' : sX.rand(min, max), 'damage' : sX.rand(min, max)-1, 'fatigue' : 0, }; }); return BODY }, 'npcForget' : function(WHO, CHAR, role) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('npcForget - NO CHAR!'); } if(!WHO.REF) { WHO.REF={}; } var refKey = CHAR.name +':'+ role; delete WHO.REF[refKey]; if(WHO.REF.length<1 && WHO.uid && $G.WORLD.NPCS[WHO.uid]) { delete $G.WORLD.NPCS[(WHO.uid||WHO.name)]; } }, 'npcRemember' : function(WHO, CHAR, role) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('npcRemember - NO CHAR!'); } if(!WHO.REF) { WHO.REF={}; } var refKey = CHAR.name +':'+ role; WHO.REF[refKey] = { 'char': CHAR.name, 'role': role, 'when': new Date, }; if(WHO.uid && !$G.WORLD.NPCS[WHO.uid]) { $G.WORLD.NPCS[WHO.uid] = WHO; } }, 'oogleLink' : function(label, OOGLE) { State.setVar('_OOGLE', OOGLE); return "<<capture _OOGLE>><<link '"+ label +"'>><<run setup.ALIAS.menu_showAs('LOOK AT');>><</link>><</capture>>"; }, 'passTime' : function(hours, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('passTime - NO CHAR!'); } var bodymass = sX.calcBodyMass(CHAR); /* bleed off excess energy at normal rate 1x/hr */ sX.energyBleedOff(hours, null, CHAR); /* PASSIVE REGEN */ sX.recoverPassive(hours, CHAR); CHAR.MATRIX.kcal -= (bodymass*hours*0.15); /* adjust weight */ sX.weightAdjust(hours, CHAR); /* Adjust the clock */ sX.addMinutes(hours*60, CHAR.STATE.Date); /* adjust the index... 0.1 point per year */ $G.WORLD.girlPower += hours/(24*365.25); /* Update status again, as weight may have changed */ sX.do_status_update(CHAR); }, 'payCost' : function(COST_MATRIX, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('payCost - NO CHAR!'); } COST_MATRIX=COST_MATRIX||{}; /* TODO: add code to verify cost CAN be paid... or in the case of karma whether it can be taken as debt */ Object.keys(COST_MATRIX).forEach(function(key) { switch(key.toLowerCase()) { case 'karma': sX.karmaSpend( COST_MATRIX[key], CHAR ); break; case 'light': sX.lightSpend( COST_MATRIX[key], CHAR ); break; case 'dark': sX.darkSpend( COST_MATRIX[key], CHAR ); break; case 'qi': sX.qiSpend( COST_MATRIX[key], CHAR ); break; case 'regen': case 'react': case 'metab': case 'power': case 'fight': case 'guard': case 'vital': case 'tough': case 'force': case 'aware': case 'train': case 'psych': case 'vigor': case 'focus': case 'skill': sX.energySpend(key, COST_MATRIX[key], CHAR ); break; default: return false; break; } }); return true; }, 'powers_hasPowerUnlocked' : function(power, CHAR) { return CHAR.POWERS[power]; }, 'powers_getPowerRank' : function(power, CHAR) { return (CHAR.POWERS[power] ? CHAR.POWERS[power].rank : 0); }, 'powers_getPowerMult' : function(power, CHAR) { var sX=setup.ALIAS; var pRank=sX.powers_getPowerRank(power, CHAR); /* TODO: allow spendable sockets for power-class nodes, for now just auto-fill class */ var pClass=sX.unstack(pRank)||0; var S=sX.statGet('all', 'current', CHAR); var mult=(1.1**(S.order + pClass)) + ((S.magnitude + pRank)/10); return (pRank ? mult : 1.0); }, 'powers_getKnown' : function(CHAR) { return CHAR.POWERS; }, 'powerTransfer' : function(FROM_CHAR, TO_CHAR, amt, PARAM) { var sX=setup.ALIAS; PARAM=PARAM||{}; /* sX.statGet(stat, secAlias, CHAR); */ var tcS = sX.statGet('all', 'current', TO_CHAR); var fcS = sX.statGet('all', 'current', FROM_CHAR); amt = sX.putInBounds(amt, 'powerTransfer-amt'); amt = Math.min(0.34, amt+tcS.caliber/100); var STAT_LIST = sX.listStats(); var drain_amt = (sX.sqrt(1+amt, '0')-1)/3; var ht_amt = ((drain_amt*FROM_CHAR.METRICS.ht)+(amt/6))/16; var beRate = $G.WORLD.RATES.breastExpansion; var hgRate = $G.WORLD.RATES.heightGain; var stat_amt = 0; $G.WORLD.girlPower += 0.001; /* you cannot take more than they have, and the drain automatically scales based on relative power levels */ Object.keys(STAT_LIST).forEach(function(stat) { if(fcS[stat]>3.00) { /* sX.statGrow(stat, secAlias, trainAmt, CHAR); */ stat_amt = Math.max(0, Math.min((fcS[stat]) * (amt/3), fcS[stat]-1)); sX.statGrow(stat, 'drain', stat_amt * (fcS[stat]/tcS[stat]), TO_CHAR); sX.statGrow(stat, 'drain', -stat_amt * (tcS[stat]/fcS[stat]), FROM_CHAR); } }); Object.keys(setup.BODY).forEach(function(part) { if(setup.BODY[part].type=='muscle') { if(FROM_CHAR.BODY[part].train>1.0) { TO_CHAR.BODY[part].train += Math.min(TO_CHAR.BODY[part].train, FROM_CHAR.BODY[part].train, (FROM_CHAR.BODY[part].train) * drain_amt * (FROM_CHAR.BODY[part].train/TO_CHAR.BODY[part].train)); FROM_CHAR.BODY[part].train -= drain_amt*FROM_CHAR.BODY[part].train; TO_CHAR.BODY[part].train = Math.min(TO_CHAR.BODY[part].train, tcS.capacity); } if(FROM_CHAR.BODY[part].train<0.99) { FROM_CHAR.BODY[part].train=1.0; } if(TO_CHAR.BODY[part].train<0.99) { TO_CHAR.BODY[part].train=1.0; } } }); if(PARAM['xfer_height']) { TO_CHAR.METRICS.ht += hgRate*ht_amt*(0.34+(FROM_CHAR.METRICS.ht/TO_CHAR.METRICS.ht)) /3; FROM_CHAR.METRICS.ht -= hgRate*ht_amt; } var fGen = FROM_CHAR.gender || FROM_CHAR.TRAITS.gender; var tGen = TO_CHAR.gender || TO_CHAR.TRAITS.gender; var beXfer = 0; if( (('female'==fGen)||('futa'==fGen)) && (('female'==tGen)||('futa'==tGen)) ) { beXfer = ht_amt*sX.rand(0.16, 0.34); if((FROM_CHAR.METRICS.bust>-5)&&(FROM_CHAR.METRICS.cup>0)) { FROM_CHAR.METRICS.bust -= beRate*beXfer; TO_CHAR.METRICS.bust += beRate*beXfer; } } }, 'prepMATRIX' : function(MATRIX) { var sX=setup.ALIAS; var newMATRIX = {}; var total = 0; Object.keys(MATRIX).forEach(function(key) { if(isNaN(MATRIX[key])) { switch(MATRIX[key]) { case '*': newMATRIX[key] = sX.rand(0.0, 10.0); total += newMATRIX[key]/2; break; } } else { newMATRIX[key] = MATRIX[key]; total += newMATRIX[key]; } }); newMATRIX['prepMATRIX-total'] = total; /* balance left and right workout, but only for random values, not deliberate 1-arm workouts */ Object.keys({'Tri':0, 'Bi':0, 'Fore':0, 'Grip':0, }).forEach(function(suffix) { if((MATRIX['Left'+suffix]=='*') && (MATRIX['Right'+suffix]=='*')) { newMATRIX['Left'+suffix] = newMATRIX['Right'+suffix] = (newMATRIX['Left'+suffix] + newMATRIX['Right'+suffix])/2; } }); return newMATRIX; }, 'putInBounds' : function(value, context, PARAMS) { if(isNaN(value)) { value=0; } var valid=value; switch(context) { case 'combatStrike-dmg': case 'combatStrike-tuf': case 'combatStrike-stamCost': /* require a positive value! */ valid=Math.max(0, value); break; case 'findChange-min_find': case 'findChange-max_find': case 'findCash-min_find': case 'findCash-max_find': case 'recoverActive-hours': case 'recoverPassive-hours': case 'doRest-hours': case 'doExplore-hours': case 'doWorkout-hours': case 'doWorkout-level': case 'trainSTATS-effort': case 'useItem-qty': case 'wildSurge_boost-amt': case 'doTrainingMATRIX-units': /* require a positive value! */ valid=Math.max(0, value); break; case 'powerTransfer-amt': /* require a value between 0.0-1.0! */ valid=Math.max(0, Math.min(value, 1)); break; case 'doEnergyMATRIX-units': case 'doDamageMATRIX-units': /* no change at this time */ valid=value; break; case 'generateRandomID-age': case 'qiFlow-cycles': /* require a value between 0.1-100.0! */ valid=Math.max(0.1, Math.min(value, 100.0)); break; default: valid=value; break; } return valid; }, 'qiAdd' : function(amt, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('qiAdd - NO CHAR!'); } var E = { 'regen':0, 'react':0, 'metab':0, 'power':0, 'fight':0, 'guard':0, 'vital':0, 'tough':0, 'force':0, 'aware':0, 'train':0, 'psych':0, 'vigor':0, 'focus':0, 'skill':0, }; var add = amt/Object.keys(E).length; var newQi = 0; /* A+|B|>A; A-|B|<A; NO EXCEPTIONS, NO MATTER HOW FUCKING LARGE EITHER NUMBER IS! */ Object.keys(E).forEach(function(e) { CHAR.MATRIX[e] = (add<0 ? Math.min(CHAR.MATRIX[e], CHAR.MATRIX[e]+add) : Math.max(CHAR.MATRIX[e], CHAR.MATRIX[e]+add) ); newQi += CHAR.MATRIX[e]; }); CHAR.MATRIX.qi = newQi; }, 'qiCalc' : function(CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('qiCalc - NO CHAR!'); } /* sX.statGet(stat, secAlias, CHAR); */ var S = sX.statGet('all', 'current', CHAR); CHAR.MATRIX.qi = ( CHAR.MATRIX.regen + CHAR.MATRIX.react + CHAR.MATRIX.metab + CHAR.MATRIX.power + CHAR.MATRIX.fight + CHAR.MATRIX.guard + CHAR.MATRIX.vital + CHAR.MATRIX.tough + CHAR.MATRIX.force + CHAR.MATRIX.aware + CHAR.MATRIX.train + CHAR.MATRIX.psych + CHAR.MATRIX.vigor + CHAR.MATRIX.focus + CHAR.MATRIX.skill ); /* moved to statRefresh */ /* CHAR.STATS.max_qi = ( sX.maxResource('regen', CHAR) + sX.maxResource('react', CHAR) + sX.maxResource('metab', CHAR) + sX.maxResource('power', CHAR) + sX.maxResource('fight', CHAR) + sX.maxResource('guard', CHAR) + sX.maxResource('vital', CHAR) + sX.maxResource('tough', CHAR) + sX.maxResource('force', CHAR) + sX.maxResource('aware', CHAR) + sX.maxResource('train', CHAR) + sX.maxResource('psych', CHAR) + sX.maxResource('vigor', CHAR) + sX.maxResource('focus', CHAR) + sX.maxResource('skill', CHAR) ); */ if(CHAR.dead) { /* cosmetic only, cap qi at zero until recovery */ CHAR.MATRIX.qi = Math.min(0, CHAR.MATRIX.qi); } }, 'qiFlow' : function(rate, cycles, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('qiFlow - NO CHAR!'); } /* sX.statGet(stat, secAlias, CHAR); */ var S = sX.statGet('all', 'current', CHAR); rate=rate||0.1; cycles=cycles||3; cycles=sX.putInBounds(cycles, 'qiFlow-cycles'); var gMul = ('she'==sX.he_she(CHAR.TRAITS.gender) ? S.caliber : sX.sqrt(S.caliber, '-') ) /69; var E = {}; var fade = (((S.max_qi/100)*rate)/3)/gMul; for(var i=0; i<cycles; i++) { if(!CHAR.dead) { E = Object.assign({}, CHAR.MATRIX); /* TODO: re-order these... */ /* QI FLOW OUTBOUND INBOUND GENERATED */ CHAR.MATRIX.vigor += -(E.vigor*rate) +( (E.metab + E.aware + E.train + E.power) /4 *rate ) +Math.abs((S.PHY+S.STR)*S.caliber*rate*gMul); CHAR.MATRIX.train += -(E.train*rate) +( (E.power + E.skill + E.react + E.psych) /4 *rate ) +Math.abs((S.WSD+S.STR)*S.caliber*rate*gMul); CHAR.MATRIX.tough += -(E.tough*rate) +( (E.vigor + E.train + E.vital + E.guard) /4 *rate ) +Math.abs((S.END+S.STR)*S.caliber*rate*gMul); CHAR.MATRIX.power += -(E.power*rate) +( (E.metab + E.react + E.skill + E.tough) /4 *rate ) +Math.abs((S.SPD+S.STR)*S.caliber*rate*gMul); CHAR.MATRIX.skill += -(E.skill*rate) +( (E.tough + E.vigor + E.fight + E.psych) /4 *rate ) +Math.abs((S.STR+S.INS)*S.caliber*rate*gMul); CHAR.MATRIX.aware += -(E.aware*rate) +( (E.train + E.react + E.vital + E.focus) /4 *rate ) +Math.abs((S.WSD+S.PHY)*S.caliber*rate*gMul); CHAR.MATRIX.vital += -(E.vital*rate) +( (E.focus + E.vigor + E.guard + E.regen) /4 *rate ) +Math.abs((S.END+S.PHY)*S.caliber*rate*gMul); CHAR.MATRIX.metab += -(E.metab*rate) +( (E.regen + E.react + E.aware + E.vital) /4 *rate ) +Math.abs((S.SPD+S.PHY)*S.caliber*rate*gMul); CHAR.MATRIX.focus += -(E.focus*rate) +( (E.vigor + E.metab + E.skill + E.fight) /4 *rate ) +Math.abs((S.PHY+S.INS)*S.caliber*rate*gMul); CHAR.MATRIX.guard += -(E.guard*rate) +( (E.regen + E.force + E.aware + E.train) /4 *rate ) +Math.abs((S.END+S.WSD)*S.caliber*rate*gMul); CHAR.MATRIX.react += -(E.react*rate) +( (E.regen + E.fight + E.psych + E.guard) /4 *rate ) +Math.abs((S.SPD+S.WSD)*S.caliber*rate*gMul); CHAR.MATRIX.psych += -(E.psych*rate) +( (E.guard + E.aware + E.force + E.focus) /4 *rate ) +Math.abs((S.WSD+S.INS)*S.caliber*rate*gMul); CHAR.MATRIX.regen += -(E.regen*rate) +( (E.power + E.fight + E.tough + E.force) /4 *rate ) +Math.abs((S.SPD+S.END)*S.caliber*rate*gMul); CHAR.MATRIX.force += -(E.force*rate) +( (E.tough + E.vital + E.focus + E.skill) /4 *rate ) +Math.abs((S.END+S.INS)*S.caliber*rate*gMul); CHAR.MATRIX.fight += -(E.fight*rate) +( (E.psych + E.force + E.power + E.metab) /4 *rate ) +Math.abs((S.SPD+S.INS)*S.caliber*rate*gMul); } else { /* decay */ sX.qiAdd(-fade*Math.random(), CHAR); /* cosmetic only, cap qi at zero until recovery */ CHAR.MATRIX.qi = Math.min(0, CHAR.MATRIX.qi); } /* sX.debugLog(JSON.stringify(CHAR.MATRIX)); */ sX.energyBleedOff(1, null, CHAR); E=null; } }, 'qiSpend' : function(amt, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('qiSpend - NO CHAR!'); } if(amt>(CHAR.MATRIX.qi-1)) { return false; } sX.qiAdd(-amt, CHAR); return true; }, 'randomStat' : function(base, dev) { return base+(((Math.random()+Math.random()+Math.random()+Math.random()+Math.random())/5)*dev*either(1,-1)*either(0.0,0.1,0.2,0.3,0.4,0.5,0.6,0.7,0.8,0.9,1.0,1.1,1.2,1.3,1.4,1.5)); }, 'recoverActive' : function(hours, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('recoverActive - NO CHAR!'); } /* sX.statGet(stat, secAlias, CHAR); */ var S = sX.statGet('all', 'current', CHAR); hours=sX.putInBounds(hours, 'recoverActive-hours'); var gMul = ('she'==sX.he_she(CHAR.TRAITS.gender||CHAR.gender) ? S.caliber : 1 ) /5; var preCalc = (hours*gMul/6); var E = CHAR.MATRIX; /* ACTIVE REGEN */ E.vigor += (S.STR + S.PHY)/10*(preCalc*3.0); E.train += (S.STR + S.WSD)/10*(preCalc*3.0); E.tough += (S.STR + S.END)/10*(preCalc*1.0); E.power += (S.STR + S.SPD)/10*(preCalc*1.0); E.skill += (S.STR + S.INS)/10*(preCalc*3.0); E.aware -= (S.PHY + S.WSD)/10*(preCalc*5.0); E.vital += (S.PHY + S.END)/10*(preCalc*3.0); E.metab += (S.PHY + S.SPD)/10*(preCalc*0.3); E.focus += (S.PHY + S.INS)/10*(preCalc*5.0); E.guard += (S.WSD + S.END)/10*(preCalc*3.0); E.react += (S.WSD + S.SPD)/10*(preCalc*5.0); E.psych += (S.WSD + S.INS)/10*(preCalc*5.0); E.regen += (S.END + S.SPD)/10*(preCalc*7.0); E.force += (S.END + S.INS)/10*(preCalc*3.0); E.fight += (S.SPD + S.INS)/10*(preCalc*5.0); /* METABOLC BONUS FROM FOOD */ E.vital += sX.sqrt(E.regen, '-')*hours; E.tough += sX.sqrt(E.vital/2, '-')*hours; E.vigor += sX.sqrt(E.metab, '-')*hours; E.power += sX.sqrt(E.vigor/2, '-')*hours; sX.regenerateBody(hours/48, hours, CHAR); sX.qiFlow(0.3, hours, CHAR); }, 'recoverPassive' : function(hours, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('recoverPassive - NO CHAR!'); } /* sX.statGet(stat, secAlias, CHAR); */ var S = sX.statGet('all', 'current', CHAR); hours=sX.putInBounds(hours, 'recoverPassive-hours'); var gMul = ('she'==sX.he_she(CHAR.TRAITS.gender||CHAR.gender) ? S.caliber : 1 ) /3; var preCalc = (hours*gMul/6); var E = CHAR.MATRIX; /* PASSIVE REGEN */ E.vigor += (S.PHY + S.STR)/10*preCalc; E.train += (S.WSD + S.STR)/10*preCalc; E.tough += (S.END + S.STR)/10*preCalc; E.power += (S.SPD + S.STR)/10*preCalc; E.skill += (S.STR + S.INS)/10*preCalc; E.aware += (S.WSD + S.PHY)/10*preCalc; E.vital += (S.END + S.PHY)/10*preCalc; E.metab += (S.SPD + S.PHY)/10*preCalc; E.focus += (S.PHY + S.INS)/10*preCalc; E.guard += (S.END + S.WSD)/10*preCalc; E.react += (S.SPD + S.WSD)/10*preCalc; E.psych += (S.WSD + S.INS)/10*preCalc; E.regen += (S.SPD + S.END)/10*preCalc; E.force += (S.END + S.INS)/10*preCalc; E.fight += (S.SPD + S.INS)/10*preCalc; /* METABOLC BONUS FROM FOOD */ E.vital += sX.sqrt(E.regen, '-')*hours; E.tough += sX.sqrt(E.vital/2, '-')*hours; E.vigor += sX.sqrt(E.metab, '-')*hours; E.power += sX.sqrt(E.vigor/2, '-')*hours; sX.regenerateBody(hours/360, hours/3, CHAR); sX.qiFlow(0.1, hours/3, CHAR); }, 'regenerateBody' : function(units, hours, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('regenerateBody - NO CHAR!'); } units=units||0.0001; /* sX.statGet(stat, secAlias, CHAR); */ var S = sX.statGet('all', 'current', CHAR); var cap = (S.capacity||3); var gMul = ('she'==sX.he_she(CHAR.TRAITS.gender||CHAR.gender) ? cap : 1 ) /3; gMul=gMul||1; var LIMBS={ 'ARMS' :{ 'total':0.0, 'min':null, 'parts':12, 'avg':0.0, 'pct':0.0 }, 'ARML' :{ 'total':0.0, 'min':null, 'parts': 8, 'avg':0.0, 'pct':0.0 }, 'ARMR' :{ 'total':0.0, 'min':null, 'parts': 8, 'avg':0.0, 'pct':0.0 }, 'LEGS' :{ 'total':0.0, 'min':null, 'parts': 6, 'avg':0.0, 'pct':0.0 }, 'LEGL' :{ 'total':0.0, 'min':null, 'parts': 6, 'avg':0.0, 'pct':0.0 }, 'LEGR' :{ 'total':0.0, 'min':null, 'parts': 6, 'avg':0.0, 'pct':0.0 }, 'CORE' :{ 'total':0.0, 'min':null, 'parts': 5, 'avg':0.0, 'pct':0.0 }, 'SEXX' :{ 'total':0.0, 'min':null, 'parts': 7, 'avg':0.0, 'pct':0.0 }, }; var base=0; var amt=0; var regen = sX.pow((CHAR.MATRIX.regen||25), 1/3, '-'); var vital = sX.pow((CHAR.MATRIX.vital||25), 1/3, '-'); var cProtein = 0; var uProtein = 0; var train = 1; var damage = 0; var fatigue = 0; var cond = 1; var wt = sX.weightGet('base', CHAR)||100; var phyRt = sX.sqrt(S.PHY, '-'); var max = sX.pow(cap, 2, '-'); /* I had better not see another fucking NaN! */ Object.keys(CHAR.BODY).forEach(function(part) { train = (CHAR.BODY[part].train||1); damage = (CHAR.BODY[part].damage||0); fatigue = (CHAR.BODY[part].fatigue||0); base = damage + ( train * cap)+regen+vital; cProtein = (CHAR.MATRIX.protein||0); uProtein = Math.min(cProtein+wt, base); CHAR.MATRIX.protein = cProtein -(uProtein/30); amt = (Math.min( damage, units*(1 + sX.sqrt(3*(base+uProtein), '-')/100) )*gMul) / S.difficulty_level; /* no more negative damage... entropy will be its own variable */ damage = Math.max(damage -amt, 0); fatigue = fatigue -((12+cap+phyRt)*hours/72); train = Math.min( (train + (amt/cap)), (cap) ); CHAR.BODY[part].damage = damage; /* never, ever, ever, under any fucking circumstance drop below 1! */ CHAR.BODY[part].train = Math.max(1, train); CHAR.BODY[part].fatigue = Math.max(0, fatigue); cond = (train * cap) -(damage*S.difficulty_level) -(fatigue*S.difficulty_level); CHAR.BODY[part].condition = cond; switch(part) { case 'Calves' : case 'Quads' : case 'Hams' : LIMBS.LEGS.total += cond; LIMBS.LEGS.min = Math.min(LIMBS.LEGS.min||cond, cond); LIMBS.LEGL.total += cond; LIMBS.LEGL.min = Math.min(LIMBS.LEGL.min||cond, cond); LIMBS.LEGR.total += cond; LIMBS.LEGR.min = Math.min(LIMBS.LEGR.min||cond, cond); break; case 'Glutes' : case 'Hips' : LIMBS.LEGS.total += cond; LIMBS.LEGS.min = Math.min(LIMBS.LEGS.min||cond, cond); LIMBS.LEGL.total += cond; LIMBS.LEGL.min = Math.min(LIMBS.LEGL.min||cond, cond); LIMBS.LEGR.total += cond; LIMBS.LEGR.min = Math.min(LIMBS.LEGR.min||cond, cond); LIMBS.SEXX.total += cond; LIMBS.SEXX.min = Math.min(LIMBS.SEXX.min||cond, cond); break; case 'Lats' : case 'Traps' : case 'Pecs' : case 'Delts' : LIMBS.ARMS.total += cond; LIMBS.ARMS.min = Math.min(LIMBS.ARMS.min||cond, cond); LIMBS.ARML.total += cond; LIMBS.ARML.min = Math.min(LIMBS.ARML.min||cond, cond); LIMBS.ARMR.total += cond; LIMBS.ARMR.min = Math.min(LIMBS.ARMR.min||cond, cond); break; case 'LeftTri' : case 'LeftBi' : case 'LeftFore' : case 'LeftGrip' : LIMBS.ARMS.total += cond; LIMBS.ARMS.min = Math.min(LIMBS.ARMS.min||cond, cond); LIMBS.ARML.total += cond; LIMBS.ARML.min = Math.min(LIMBS.ARML.min||cond, cond); break; case 'RightTri' : case 'RightBi' : case 'RightFore': case 'RightGrip': LIMBS.ARMS.total += cond; LIMBS.ARMS.min = Math.min(LIMBS.ARMS.min||cond, cond); LIMBS.ARMR.total += cond; LIMBS.ARMR.min = Math.min(LIMBS.ARMR.min||cond, cond); break; case 'Abs' : case 'Kegel' : case 'LoBack' : LIMBS.CORE.total += cond; LIMBS.CORE.min = Math.min(LIMBS.CORE.min||cond, cond); LIMBS.SEXX.total += cond; LIMBS.SEXX.min = Math.min(LIMBS.SEXX.min||cond, cond); break; case 'Cardio' : case 'Brain' : LIMBS.CORE.total += cond; LIMBS.CORE.min = Math.min(LIMBS.CORE.min||cond, cond); LIMBS.SEXX.total += cond; LIMBS.SEXX.min = Math.min(LIMBS.SEXX.min||cond, cond); break; } }); LIMBS.ARMS.avg = ( LIMBS.ARMS.min+ (LIMBS.ARMS.total/LIMBS.ARMS.parts) )/2; LIMBS.ARMS.pct = LIMBS.ARMS.avg /max; LIMBS.ARML.avg = ( LIMBS.ARML.min+ (LIMBS.ARML.total/LIMBS.ARML.parts) )/2; LIMBS.ARML.pct = LIMBS.ARML.avg /max; LIMBS.ARMR.avg = ( LIMBS.ARMR.min+ (LIMBS.ARMR.total/LIMBS.ARMR.parts) )/2; LIMBS.ARMR.pct = LIMBS.ARMR.avg /max; LIMBS.LEGS.avg = ( LIMBS.LEGS.min+ (LIMBS.LEGS.total/LIMBS.LEGS.parts) )/2; LIMBS.LEGS.pct = LIMBS.LEGS.avg /max; LIMBS.LEGL.avg = ( LIMBS.LEGL.min+ (LIMBS.LEGL.total/LIMBS.LEGL.parts) )/2; LIMBS.LEGL.pct = LIMBS.LEGL.avg /max; LIMBS.LEGR.avg = ( LIMBS.LEGR.min+ (LIMBS.LEGR.total/LIMBS.LEGR.parts) )/2; LIMBS.LEGR.pct = LIMBS.LEGR.avg /max; LIMBS.CORE.avg = ( LIMBS.CORE.min+ (LIMBS.CORE.total/LIMBS.CORE.parts) )/2; LIMBS.CORE.pct = LIMBS.CORE.avg /max; LIMBS.SEXX.avg = ( LIMBS.SEXX.min+ (LIMBS.SEXX.total/LIMBS.SEXX.parts) )/2; LIMBS.SEXX.pct = LIMBS.SEXX.avg /max; CHAR.LIMBS = LIMBS; }, 'removeItem' : function(item_id, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('removeItem - NO CHAR!'); } var slot_id = sX.getItem(item_id).role; /* if something is there remove the item, but keep the slot */ if(CHAR.EQUIP[slot_id]) { CHAR.EQUIP[slot_id]=null; return true; } else { /* item does not match a known slot type or is not equipped */ return true; } }, 'replacePassage' : function(encounter, passage) { passage=passage||State.passage; encounter=encounter||_encounter; /* keeps saying setup is not defined */ if(typeof setup.ENCOUNTERS[encounter].replacePassage === 'function') { return setup.ENCOUNTERS[encounter].replacePassage(); } }, 'secondChance' : function(CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('secondChance - NO CHAR!'); } var out = ''; var how = null; State.setVar( '_CHAR', CHAR ); switch(true) { case ((CHAR.R.S.chrono) && (CHAR.R.S.chrono>0)): how='timeshard'; break; default: break; } if(how) { out = "<<link 'I'M NOT DONE YET!'>><<run setup.ALIAS.secondWind('"+ how +"', _CHAR); >><<goto 'GO HOME'>><</link>>"; } return out; }, 'secondWind' : function(how, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('secondWind - NO CHAR!'); } /* sX.statGet(stat, secAlias, CHAR); */ var S = sX.statGet('all', 'current', CHAR); switch(how) { case 'timeshard': CHAR.R.S.chrono--; sX.giveFeedback('The memory of your death still fresh in your mind, you awaken mere seconds later. You body has completely regenerated, death will not have you this day...'); break; default: break; } CHAR.CoD=null; CHAR.dead=false; CHAR.MATRIX.kcal = 0; CHAR.MATRIX.sugar = 0; CHAR.MATRIX.protein = 0; sX.qiAdd(sX.pow(S.level, 2, '-')*15, CHAR); if(sX.weightGet('base', CHAR)<CHAR.METRICS.base_ht) { sX.weightSetMin('base', (CHAR.METRICS.base_ht*2)+S.caliber, CHAR); } CHAR.MATRIX.light=S.light_well*S.magnitude; CHAR.MATRIX.dark =S.dark_well *S.magnitude; }, 'select_char' : function(char_name) { var sX=setup.ALIAS; $G.PC = setup.CHARS[char_name]; sX.do_status_update($G.PC); if(!$G.PC.STATE) { $G.PC.STATE ={ 'saveVersion' : sX.engineVersion, 'feedbackQueue' : [], 'Date' : new Date(), 'lastPassage' : null, 'lastExercise' : null, 'lastActivity' : null, 'lastAction' : null, 'lastItem' : null, }; } }, 'setEncounter' : function(encounter) { return encounter; }, 'setupPassage' : function(passage) { var sX=setup.ALIAS; var sENC=setup.ENCOUNTERS; var sPAS=setup.PASSAGES; passage=passage||State.passage; sX.do_status_update($G.PC); /* run passage setup */ sPAS[passage].setup(); var encounter = sX.setEncounter(sX.spinTheWheel(sPAS[passage].ENCOUNTERS)); State.setVar( '_encounter', encounter ); /* IF event has variations, update _encounter to a specific one */ if(sENC[_encounter].VARIATIONS) { var sub_encounter = sX.spinTheWheel(sENC[_encounter].VARIATIONS); State.setVar( '_encounter', sub_encounter ); } /* run encounter setup */ sENC[encounter].setup(); if(sENC[encounter].hideMenu || sENC[encounter].replace) { sX.hideSideBar(); } return null; }, 'shardSpawn' : function(CHAR, power, flow) { var sX=setup.ALIAS; var cal = CHAR.S.CALC.Cal||1; var mag = CHAR.S.CALC.Mag||1; var rank=(CHAR.POWERS[power] ? CHAR.POWERS[power].rank : 0)||0; flow=flow||0.34; var odds = ( ( (cal/mag) + (mag+rank) )*flow )/100; return sX.lootQty(CHAR, odds); }, 'slaveCard' : function(slave_id, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('slaveCard - NO CHAR!'); } if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; } var SLAVE = CHAR.SLAVES[slave_id]; return " <div class='slave glass' tabindex='0'> <div class='top_bar glass'><h4 class='item_name'>"+ SLAVE.name +"</h4></div> <div class='info glass'> <div class='icon-frame'> <div><img class='icon glass' /></div> </div> <div class='detail-pane'> <div id='slave_detail'>"+ sX.slaveDetails(slave_id, CHAR) +"</div> </div> </div> <div class='bottom_bar glass'> <span class='link'> <<link '[INTERACT WITH]' >> <<set _slave='"+ slave_id +"';>> <<run setup.ALIAS.menuShow('slaves'); >> <</link>> </span> </div> </div> "; }, 'slaveDetails' : function(slave_id, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('slaveDetails - NO CHAR!'); } if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; } var SLAVE = CHAR.SLAVES[slave_id]; /* sX.statGet(stat, secAlias, CHAR); */ var S = sX.statGet('all', 'current', SLAVE); var E = SLAVE.MATRIX; E.kcal =E.kcal ||0; E.protein =E.protein ||0; E.sugar =E.sugar ||0; return " <div class='details'> <span>Age: "+ Math.round(SLAVE.age) +" </span> <span>Gender: "+ SLAVE.gender +" </span> <span>Caught: "+ sX.getLongDate(SLAVE.captured) +" </span> <span>Height: "+ sX.char_metric('ht', SLAVE) +" </span> <span>Weight: "+ sX.char_metric('wt', SLAVE) +" </span> <span>figure: "+ sX.char_metric('figure', SLAVE) +" </span> <span>Protein: "+ E.protein.toLocaleString(undefined, {minimumFractionDigits: 0, maximumFractionDigits: 0}) +"g</span> <span>Sugar: "+ E.sugar.toLocaleString(undefined, {minimumFractionDigits: 0, maximumFractionDigits: 0}) +"g</span> <span>Calories: "+ E.kcal.toLocaleString(undefined, {minimumFractionDigits: 0, maximumFractionDigits: 0}) +" </span> <span>Tone %: "+ sX.char_metric('bodytone', SLAVE) +" </span> <span>Fat %: "+ sX.char_metric('bodyfat', SLAVE) +" </span> <span>level: "+ S.level.toLocaleString(undefined, {minimumFractionDigits: 0, maximumFractionDigits: 0}) +" . . . caliber: "+ S.caliber.toLocaleString(undefined, {minimumFractionDigits: 0, maximumFractionDigits: 0}) +" </span> <span>Bicep: "+ sX.char_metric('bicep', SLAVE) +" </span> <span>Quads: "+ sX.char_metric('quads', SLAVE) +" </span> <span>Qi: "+ E.qi.toLocaleString(undefined, {minimumFractionDigits: 0, maximumFractionDigits: 0}) +" / "+ S.max_qi.toLocaleString(undefined, {minimumFractionDigits: 0, maximumFractionDigits: 0}) +" </span> <span>STR: "+ sX.statPrint('STR', SLAVE) +" </span> <span>PHY: "+ sX.statPrint('PHY', SLAVE) +" </span> <span>WSD: "+ sX.statPrint('WSD', SLAVE) +" </span> <span>INS: "+ sX.statPrint('INS', SLAVE) +" </span> <span>SPD: "+ sX.statPrint('SPD', SLAVE) +" </span> <span>END: "+ sX.statPrint('END', SLAVE) +" </span> </div> <div>"+ sX.listConditions(SLAVE) +"</div> "; }, 'slaveDispose' : function(slave_id, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('slaveDispose - NO CHAR!'); } if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; } delete CHAR.SLAVES[slave_id]; _slave=null; return 'Gone.'; }, 'slaveDrain' : function(slave_id, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('slaveDrain - NO CHAR!'); } if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; } var SLAVE = CHAR.SLAVES[slave_id]; /* sX.statGet(stat, secAlias, CHAR); */ var aS = sX.statGet('all', 'current', CHAR); var dS = sX.statGet('all', 'current', SLAVE); if(SLAVE.dead) { return 'Nothing left to take, '+ SLAVE.name +'is dead.'; } if(!(CHAR.MATRIX.dark>=(dS.caliber*dS.level))) { return 'not enough dark energy to feed...'; } var RES = sX.combatDrain(CHAR, SLAVE, 'beta'); sX.slaveRefreshCard(slave_id, CHAR); if(CHAR.MATRIX.qi<1) { /* pass out... */ sX.giveFeedback('You overexerted yourself trying to drain '+ SLAVE.name_first +'...'); sX.menuHide(); out += "<<goto 'GO HOME'>>"; } return ('You drain '+ (RES.pct*100).toLocaleString(undefined, {minimumFractionDigits: 0, maximumFractionDigits: 0}) +'% from '+ SLAVE.name +', and watch '+ sX.him_her(SLAVE.gender) +' shrivel as you grow.') +(RES.shards>0 ? ' Creating '+RES.shards+' blood-shards in the process.' : ''); }, 'slaveDress' : function(slave_id, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('slaveDress - NO CHAR!'); } if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; } return 'Dress Slave... not yet implemented' +(settings.debugModeInfo ? " <small><br />(expected to be added when the the clothing/equipment system is revamped to track individual articles not just wear-charges... in Engine v0.??)</small>" : ''); /* return "<<include 'EQUIP'>>"; */ }, 'slaveExamine' : function(slave_id, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('slaveExamine - NO CHAR!'); } if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; } return sX.wrap(sX.char_appearance(CHAR.SLAVES[slave_id]), 'div', 'just'); }, 'slaveFeed' : function(slave_id, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('slaveFeed - NO CHAR!'); } if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; } State.setVar('_SOURCE_CHAR', CHAR); State.setVar('_TARGET_CHAR', CHAR.SLAVES[slave_id]); return "<<include 'FOOD'>>"; }, 'slaveFight' : function(slave_id, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('slaveFight - NO CHAR!'); } if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; } sX.regenerateBody(0.0001, 0.0001, CHAR.SLAVES[slave_id]); State.setVar( '_P2', CHAR.SLAVES[slave_id] ); sX.hideSideBar(); setup.ENCOUNTERS.combat.setup(); sX.menuHide(); return "<<replace '#passages'>><<include 'COMBAT UI'>><</replace>>"; }, 'slaveFree' : function(slave_id, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('slaveFree - NO CHAR!'); } if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; } var WORLD=$G.WORLD; var SLAVE = CHAR.SLAVES[slave_id]; SLAVE.released = new Date; SLAVE.kidnapped = false; var them = sX.him_her(SLAVE.gender); var they = sX.he_she(SLAVE.gender); /* ensure we have them in the world array */ if(!WORLD.NPCS[slave_id]) { WORLD.NPCS[slave_id] = SLAVE; } /* move them to ex-slaves */ CHAR.EXSLAVES[slave_id] = SLAVE; delete CHAR.SLAVES[slave_id]; return ('You set '+ SLAVE.name +' free... at first '+ they +' seems hesitant to leave, perhaps afraid this is a test- but you shoo '+ them +' away and soon '+ they +''s out of sight. You can't help but wonder if '+ SLAVE.name_first +' can make the transition back to ordinary life... perhaps you'll meet '+ them +' again someday.'); }, 'slaveHeal' : function(slave_id, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('slaveHeal - NO CHAR!'); } if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; } var SLAVE=CHAR.SLAVES[slave_id]; var out=''; /* sX.statGet(stat, secAlias, CHAR); */ var aS = sX.statGet('all', 'current', CHAR); var dS = sX.statGet('all', 'current', SLAVE); sX.combatHeal(CHAR, SLAVE, 'beta'); out += " Tapping into the Primal Flow, you channel your focus to heal "+ SLAVE.name_first +", and watch as "+ sX.his_her(SLAVE.gender) + " wounds begin to close..."; if(Math.random()<(sX.sqrt(aS.caliber, '+')*sX.rand(0.16,16.0)/1000)) { out += either( 'A fluctuation in the field triggers', 'A momentary distraction results in', 'A ripple sends back', 'An eddy in the current generates', 'Losing yourself in ecstacy of the raw Primal Force, you call forth' ) + " a Wild Surge, as "; out += sX.wildSurge(CHAR, SLAVE); } else if(SLAVE.dead && (sX.charTempVar(SLAVE, 'newQi')>(dS.max_qi/3))) { sX.combatRevive(CHAR, SLAVE, 'beta'); sX.lightAdd(sX.logX(10, 10000, '-'), CHAR); out += " Unbelievably, you manage to stabley channel enough raw primal essence to completely restore "+ SLAVE.name_first +" back to life."; } else if(SLAVE.dead) { SLAVE.MATRIX.qi=Math.min(SLAVE.MATRIX.qi, 0); out += " Despite your efforts, "+ SLAVE.name_first +" is still dead."; } else if (SLAVE.stun && SLAVE.MATRIX.qi>0) { SLAVE.stun = false; SLAVE.ko = false; out += " The energies coursing through "+ sX.his_her(SLAVE.gender) + " body were strong enough to get "+ sX.him_her(SLAVE.gender) + " back on "+ sX.his_her(SLAVE.gender) + " feet..."; } if(CHAR.MATRIX.qi<1) { /* pass out... */ sX.giveFeedback('You overexerted yourself trying to heal '+ SLAVE.name_first +'...'); sX.menuHide(); out += "<<goto 'GO HOME'>>"; } sX.slaveRefreshCard(slave_id, CHAR); return "<small style='display: inline-block; text-align: justify; padding: 0.1em 0.25em;'>"+ out +"</small>"; }, 'slaveInteractions' : function(slave_id, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('slaveInteractions - NO CHAR!'); } if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; } var SLAVE = CHAR.SLAVES[slave_id]; var THEM = sX.him_her(SLAVE.gender).toUpperCase(); var THEIR = sX.his_her(SLAVE.gender).toUpperCase(); State.setVar( '_CHAR', CHAR ); return " <<set _THEM='"+ THEM +"'>><<set _THEIR='"+ THEIR +"'>> <div class='slave-lg glass' tabindex='0'> <div class='top_bar glass'><h4 class='item_name'>"+ SLAVE.name +"</h4></div> <div class='info glass'> <div class='icon-frame'> <div><img class='icon glass' /></div> </div> <div class='detail-pane'> <div id='slave_detail'>"+ sX.slaveDetails(slave_id, CHAR) +"</div> </div> </div> <div class='bottom_bar glass tiny'> <span class='link' ><<link 'CHECK _THEIR MUSCLETONE' >><<replace '#slave_desc'>><<print setup.ALIAS.slaveMuscle('" + slave_id + "', _CHAR );>><</replace>><</link>></span> <span class='link' ><<link 'EXAMINE _THEM' >><<replace '#slave_desc'>><<print setup.ALIAS.slaveExamine('" + slave_id + "', _CHAR );>><</replace>><</link>></span> <span class='link' ><<link 'FEED _THEM' >><<replace '#slave_desc'>><<print setup.ALIAS.slaveFeed('" + slave_id + "', _CHAR );>><</replace>><</link>></span> <span class='link disabled' ><<link 'DRESS _THEM' >><<replace '#slave_desc'>><<print setup.ALIAS.slaveDress('" + slave_id + "', _CHAR );>><</replace>><</link>></span> <span class='link disabled' ><<link 'TALK TO _THEM' >><<replace '#slave_desc'>><<print setup.ALIAS.slaveTalk('" + slave_id + "', _CHAR );>><</replace>><</link>></span> <span class='link' ><<link 'FIGHT _THEM' >><<replace '#slave_desc'>><<print setup.ALIAS.slaveFight('" + slave_id + "', _CHAR );>><</replace>><</link>></span> <span class='link disabled' ><<link 'USE _THEM' >><<replace '#slave_desc'>><<print setup.ALIAS.slaveUse('" + slave_id + "', _CHAR );>><</replace>><</link>></span> <span class='link disabled' ><<link 'PUNISH _THEM' >><<replace '#slave_desc'>><<print setup.ALIAS.slavePunish('" + slave_id + "', _CHAR );>><</replace>><</link>></span> <span class='link' ><<link 'HEAL _THEM' >><<replace '#slave_desc'>><<print setup.ALIAS.slaveHeal('" + slave_id + "', _CHAR );>><</replace>><</link>></span> <span class='link' ><<link 'DRAIN _THEM' >><<replace '#slave_desc'>><<print setup.ALIAS.slaveDrain('" + slave_id + "', _CHAR );>><</replace>><</link>></span> <span class='link disabled' ><<link 'TRAIN _THEM' >><<replace '#slave_desc'>><<print setup.ALIAS.slaveTrain('" + slave_id + "', _CHAR );>><</replace>><</link>></span> <span class='link' ><<link 'RENAME _THEM' >><<replace '#slave_desc'>><<print setup.ALIAS.slaveRename('" + slave_id + "', _CHAR );>><</replace>><</link>></span> <span class='link disabled' ><<link 'PLAY AS _THEM' >><<replace '#slave_desc'>><<print setup.ALIAS.slavePlayAs('" + slave_id + "', _CHAR );>><</replace>><</link>></span> " +( SLAVE.dead ? " <span class='link' ><<link 'DISPOSE OF BODY' >><<replace '#slave_desc'>><<print setup.ALIAS.slaveDispose('" + slave_id + "', _CHAR );>><</replace>><</link>></span> " : " <span class='link' ><<link 'SET _THEM FREE' >><<replace '#slave_desc'>><<print setup.ALIAS.slaveFree('" + slave_id + "', _CHAR );>><</replace>><</link>></span> " )+ " </div> <div class='bottom_bar no-glass'> <div id='slave_desc'></div> </div> </div> "; }, 'slaveMuscle' : function(slave_id, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('slaveMuscle - NO CHAR!'); } if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; } return sX.listMuscleStatus(CHAR.SLAVES[slave_id]); }, 'slavePlayAs' : function(slave_id, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('slavePlayAs - NO CHAR!'); } if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; } return 'Play As... not yet implemented' +(settings.debugModeInfo ? " <small><br />(expected to be added when character-switching is added... sometime before Engine v0.55)</small>" : ''); }, 'slavePunish' : function(slave_id, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('slavePunish - NO CHAR!'); } if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; } return 'Punish Slave... not yet implemented' +(settings.debugModeInfo ? " <small><br />(expected to be added with adult interactions ... in Engine v0.8)</small>" : ''); }, 'slaveRefreshCard' : function(slave_id, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('slaveRefreshCard - NO CHAR!'); } if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; } $('#slave_detail').html(''); $('#slave_detail').wiki(sX.slaveDetails(slave_id, CHAR)); }, 'slaveRename' : function(slave_id, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('slaveRename - NO CHAR!'); } if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; } var new_name = slave_id; var allowed = /^[A-Za-z0-9 _,.#*@!?%$+-]+$/; do{ /* NO CANCELING! */ if(!new_name) { new_name=slave_id; } new_name = prompt('Enter a new name for '+slave_id, new_name); } while(!new_name || !new_name.match(allowed)); CHAR.SLAVES[slave_id].name = new_name; return '"'+ slave_id +'" changed to "'+ new_name +'"'; }, 'slaveTalk' : function(slave_id, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('slaveTalk - NO CHAR!'); } if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; } return ('Talk to Slave... not yet implemented') +(settings.debugModeInfo ? " <small><br />(expected to be added with relationsips/biases ... in Engine v0.7)</small>" : ''); }, 'slaveTrain' : function(slave_id, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('slaveTrain - NO CHAR!'); } if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; } return 'Train Slave... not yet implemented' +(settings.debugModeInfo ? " <small><br />(expected to be added after time switched to passive mode ... sometime between Engine v0.26-0.33)</small>" : ''); }, 'slaveUse' : function(slave_id, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('slaveUse - NO CHAR!'); } if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; } return 'Use Slave... not yet implemented' +(settings.debugModeInfo ? " <small><br />(expected to be added with adult interactions ... in Engine v0.8)</small>" : ''); }, 'slavesList' : function(CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('slavesList - NO CHAR!'); } var slaves = ''; var SLAVE = null; Object.keys(CHAR.SLAVES).forEach(function(slave) { if(!CHAR.SLAVES[slave].figure) { CHAR.SLAVES[slave].figure=sX.char_metric('figure', CHAR.SLAVES[slave]); } slaves += sX.slaveCard(slave, CHAR); }); return slaves; }, 'species_baseAttr' : function(species, attr, PARAMS) { var sR=setup.RACES; /* =species ~species[race|sex|class|job:*] */ /* value types: A, A-B, +B, -B, ~B, A~B -- note this does not allow negative A values... */ }, 'species_randAttr' : function(species, attr, PARAMS) { var sR=setup.RACES; /* =species ~species[race|sex|class|job:*] */ /* syntax: attr1:prob1; attr2:prob2; attr3:prob3 ... */ }, 'species_randMetric' : function(species, metric, PARAMS) { var sR=setup.RACES; /* =species ~species[race|sex|class|job:*] */ /* value types: A, A-B, +B, -B, ~B, A~B -- note this does not allow negative A values... */ }, 'species_splitAttr' : function(species, attr, PARAMS) { var sR=setup.RACES; /* =species ~species[race|sex|class|job:*] */ /* syntax: attr1:val1; attr2:val2; attr3:val3 ... */ /* value types: A, A-B, +B, -B, ~B, A~B -- note this does not allow negative A values... */ }, 'statBuff' : function(stat, sec, BUFF, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('statBuff - NO CHAR!'); } /* NOTE: buff-system not finalized, do not use... TODO: WiP */ var S = CHAR.S; var C = S.CALC; if(!CHAR.S[stat].TEMP[sec]) { CHAR.S[stat].TEMP[sec]=BUFF; } else { CHAR.S[stat].TEMP[sec].amt = sX.forceInRange(-C.Cap, CHAR.S[stat].TEMP[sec].amt+BUFF.val, C.Cap); CHAR.S[stat].TEMP[sec].exp = BUFF.exp; } /* also add BUFF to the buffs list with expiration */ /* add TEMP / Lv / Cal / Mag points to base */ S[stat].base += baseMod/C.Lv/C.Cal/C.Mag; }, 'statGet' : function(stat, secAlias, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('statGet - NO CHAR!'); } var sec = null; var alias = secAlias; var out = null; /* Aliases are CaseFuckingSensative, keep it that way or it will fuck everything up! */ switch(secAlias) { case 'base': break; case 'pow': break; case 'mult': break; case '~cache': case 'cache': case 'current': secAlias='~cache'; alias='~cache'; break; /* PERM */ case 'drain': case 'evolve': case 'genes': case 'karma': case 'primal': case 'train': case 'health': case 'energy': sec = 'PERM'; break; /* CALC */ case 'Lv': case 'Cal': case 'Mag': case 'Cap': case 'maxWK': case 'maxKK': stat = 'CALC'; alias=secAlias; sec = null; break; default: /* check all unknowns against the temporary buffs... */ sec = 'TEMP'; break; } /* stat data not converted yet! */ /* if(false && !('all'==stat) && !(CHAR.S&&CHAR.S[stat])) { return CHAR.STATS[stat]; } */ switch(stat) { case 'STR': case 'PHY': case 'WSD': case 'END': case 'SPD': case 'INS': if(!sec) { /* simple values */ out = CHAR.S[stat][alias]; } else if('TEMP'==sec) { /* temporary buffs/debuffs have extra information */ if(!(CHAR.S[stat][sec][alias]&&CHAR.S[stat][sec][alias].amt)) { out = null; } else { out = CHAR.S[stat][sec][alias].amt; } } else { /* permanent modifiers */ out = CHAR.S[stat][sec][alias]; } break; case 'CALC': out = CHAR.S[stat][alias]; break; case 'all': case 'basic': case 'light': case 'dark': case 'primal': case 'astral': case 'ethereal': case 'calc': out = {}; if(('all'==stat)||('basic'==stat)||('light'==stat)||('primal' ==stat)) { out['STR']=sX.statGet('STR', secAlias, CHAR); } if(('all'==stat)||('basic'==stat)||('dark' ==stat)||('astral' ==stat)) { out['PHY']=sX.statGet('PHY', secAlias, CHAR); } if(('all'==stat)||('basic'==stat)||('light'==stat)||('ethereal'==stat)) { out['WSD']=sX.statGet('WSD', secAlias, CHAR); } if(('all'==stat)||('basic'==stat)||('dark' ==stat)||('primal' ==stat)) { out['END']=sX.statGet('END', secAlias, CHAR); } if(('all'==stat)||('basic'==stat)||('light'==stat)||('astral' ==stat)) { out['SPD']=sX.statGet('SPD', secAlias, CHAR); } if(('all'==stat)||('basic'==stat)||('dark' ==stat)||('ethereal'==stat)) { out['INS']=sX.statGet('INS', secAlias, CHAR); } if(('all'==stat)||('calc' ==stat)) { out['level'] = CHAR.S.CALC.Lv; out['caliber'] = CHAR.S.CALC.Cal; out['magnitude'] = CHAR.S.CALC.Mag; out['order'] = CHAR.S.CALC.Ord; out['capacity'] = CHAR.S.CALC.Cap; out['difficulty_level'] = CHAR.S.CALC.diffLv; out['light_well'] = CHAR.S.CALC.maxWK; out['dark_well'] = CHAR.S.CALC.maxKK; out['max_qi'] = CHAR.S.CALC.max_qi; out['workout_hrs'] = CHAR.S.CALC.workout_hrs; } default: break; } /* if('undefined'==typeof(out)) { sX.WTF(CHAR); } */ return out; }, 'statGrow' : function(statAlias, secAlias, trainAmt, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('statGrow - NO CHAR!'); } var diff=(($G.PC.NAMES===CHAR.NAMES) ? sX.worldVarGet('game.difficulty.level', 1.0) : 1.0); /* if prevent stats from going below 1, and modifiers from going beyond +/- capacity */ var S = CHAR.S; var C = S.CALC; var baseMod = 0; var STATS = null; var perm = false; var baseRate = 0.1; /* 10% added to base... */ var beRate = $G.WORLD.RATES.breastExpansion; var hgRate = $G.WORLD.RATES.heightGain; var f = ('she'===sX.he_she(CHAR.TRAITS.gender)); var gpMod = sX.unstack($G.WORLD.girlPower)*trainAmt/100; trainAmt += (f ? 1 : -1)*gpMod/diff; /* add heightGain/BE effects? */ CHAR.METRICS.ht += hgRate*trainAmt/16; CHAR.METRICS.bust += beRate*trainAmt/34*(f?1:0); switch(secAlias.toLowerCase()) { case 'drain': case 'evolve': case 'genes': case 'karma': case 'primal': case 'train': case 'health': case 'energy': case 'cyber': case 'magic': case 'psych': case 'mutate': case 'cond': case 'skill': case 'faith': case 'gear': case 'alch': case 'racial': case 'emote': case 'souls': case 'bless': case 'demon': case 'focus': case 'alien': /* add PERM / Lv * Cal / Mag points to base... grows Cal^2 faster than TEMP points */ perm = true; break; default: return false; break; } switch(statAlias) { case 'STR': case 'PHY': case 'WSD': case 'END': case 'SPD': case 'INS': STATS = [statAlias]; break; default: STATS = []; if(('all'==statAlias)||('light'==statAlias)||('primal' ==statAlias)) { STATS.push('STR'); } if(('all'==statAlias)||('dark' ==statAlias)||('astral' ==statAlias)) { STATS.push('PHY'); } if(('all'==statAlias)||('light'==statAlias)||('ethereal'==statAlias)) { STATS.push('WSD'); } if(('all'==statAlias)||('dark' ==statAlias)||('primal' ==statAlias)) { STATS.push('END'); } if(('all'==statAlias)||('light'==statAlias)||('astral' ==statAlias)) { STATS.push('SPD'); } if(('all'==statAlias)||('dark' ==statAlias)||('ethereal'==statAlias)) { STATS.push('INS'); } break; } STATS.forEach(function(stat) { if(!S[stat].PERM[secAlias]) { S[stat].PERM[secAlias]=0; } S[stat].PERM[secAlias] = sX.forceInRange(-C.Cap, S[stat].PERM[secAlias]+trainAmt, C.Cap); /* TODO: divide growth by game level, and add progression rate multiplier (for buffs/debuffs/conditions/difficulty/and manual-adjustment) */ if(perm) { baseMod = baseRate*sX.forceInRange(-C.Cap, trainAmt, C.Cap)/C.Lv*C.Cap; } else { baseMod = baseRate*sX.forceInRange(-C.Cap, trainAmt, C.Cap)/C.Lv/C.Cap; } /* stats can never be dropped below Magnitude */ S[stat].base = Math.max(C.Mag, S[stat].base+baseMod); }); /* loop here through all 6 stats and decide which to train... STR, all, light, primal, etc., do we allow *stat* to be an array? */ /* based in sec, PERM adds trainAmt/Lv*Cap, TEMP adds trainAmt/Lv/Cap, base just adds trainAmt and should not typically be called directly, and no other versions are valid - power does not train in this way... does it? */ }, 'statPrint' : function(stat, CHAR, PARAMS) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('statPrint - NO CHAR!'); } PARAMS=PARAMS||{}; PARAMS['secAlias']=PARAMS['secAlias']||'current'; /* sX.statGet(stat, secAlias, CHAR); */ var statVal = sX.statGet(stat, PARAMS['secAlias'], CHAR); var pow = sX.statGet(stat, 'pow', CHAR); var rank = sX.romanNumeral(pow, ' '); return "<span class='statval "+stat+"' pow='"+rank+"'>"+ (settings.decimal_styling ? sX.prettyDecimal(statVal) : statVal.toLocaleString(undefined, {minimumFractionDigits: 3, maximumFractionDigits: 3})) +"</span>"; /* return "<span class='statval "+stat+"'><span class='major'>"+ PARTS[0] +"</span><span class='minor'>."+ PARTS[1] +"</span></span>"; */ }, 'statRefresh' : function(CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('statRefresh - NO CHAR!'); } var diff=(($G.PC.NAMES===CHAR.NAMES) ? sX.worldVarGet('game.difficulty.level', 1.0) : 1.0); /* recalculate level in case stats have changed... */ var S = sX.statGet('basic', 'base', CHAR); var sumW = (S.STR + S.WSD + S.SPD); var sumK = (S.PHY + S.END + S.INS); if(!CHAR.S.CALC) { CHAR.S.CALC={}; } var Lv = (sumW+sumK) /6 /diff; CHAR.S.CALC['Lv'] = Lv; var Cal = sX.unstack(Lv); CHAR.S.CALC['Cal'] = Cal; var Mag = sX.unstack(Cal); CHAR.S.CALC['Mag'] = Mag; var Ord = sX.unstack(Mag); CHAR.S.CALC['Ord'] = Ord; var Cap = (Cal+Mag)*diff; CHAR.S.CALC['Cap'] = Cap; CHAR.S.CALC['diffLv'] = diff; var light_well = sX.unstack(sumW/3)*Mag; CHAR.S.CALC['maxWK'] = light_well; var dark_well = sX.unstack(sumK/3)*Mag; CHAR.S.CALC['maxKK'] = dark_well; var workout_hrs = sX.stack(Lv)/60; CHAR.S.CALC['workout_hrs'] = workout_hrs; var gpVal = $G.WORLD.girlPower-1; var they = sX.he_she(CHAR.TRAITS.gender); var gPbuff = (('she'==they) ? gpVal : -sX.sqrt(gpVal, '+')); var BASE_STATS = ['STR','PHY','WSD','END','SPD','INS']; var pow = 0; var mult = 1; var modVal = 0; var modTotal = 0; var modBonus = 0; BASE_STATS.forEach(function(stat) { pow = sX.powers_getPowerRank('x'+stat, CHAR); CHAR.S[stat]['pow'] = pow; mult=sX.powers_getPowerMult('x'+stat, CHAR); CHAR.S[stat]['mult'] = mult; modTotal = 0; modBonus = 0; Object.keys(CHAR.S[stat]['PERM']).forEach(function(mod) { modVal = sX.forceInRange(-Cap, CHAR.S[stat]['PERM'][mod], Cap); CHAR.S[stat]['PERM'][mod] = modVal; modTotal += modVal; /* bonus for EACH source of training/growth */ modBonus += sX.unstack(modVal); }); Object.keys(CHAR.S[stat]['TEMP']).forEach(function(mod) { modVal = sX.forceInRange(-Cap, CHAR.S[stat]['TEMP'][mod].amt, Cap); CHAR.S[stat]['TEMP'][mod].amt = modVal; modTotal += modVal; /* TODO: add check for expiration on buffs/debuffs... */ }); CHAR.S[stat]['TEMP']['girlPower'] = { 'amt': sX.forceInRange(-Cap, gPbuff, Cap), 'exp': null, }; /* total for all modifers, Permanent & Temporary, cannot exceed stat-overcharge */ var maxMod = (S[stat]*Mag); modTotal=sX.forceInRange(-maxMod, modTotal, maxMod); /* never less than Capacity... adjusted for difficulty so Capacity remains the same across all! */ CHAR.S[stat]['~cache'] = Math.max(Cap, (S[stat]+modTotal+modBonus)*(mult))/diff; }); var cS = sX.statGet('basic', 'current', CHAR); /* sum of all energies/combinations */ var max_qi = (cS.STR + cS.PHY + cS.WSD + cS.END + cS.SPD + cS.INS)*5; CHAR.S.CALC['max_qi'] = max_qi; }, 'statSet' : function(stat, val, CHAR) { }, 'stealItem' : function(item_id, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('stealItem - NO CHAR!'); } $G.PC.STATE.lastAction = 'steal'; var ITEM = sX.getItem(item_id); var success=null; if((CHAR.MATRIX.light>CHAR.MATRIX.dark) && (CHAR.MATRIX.light>ITEM.cost)) { sX.lightAdd(-sX.logX(10, ITEM.cost, '-'), CHAR); sX.giveFeedback('You took [' + ITEM.name + '] ...luckily nobody saw you.'); success=true; } else if(CHAR.MATRIX.dark>(ITEM.cost/2)) { sX.karmaAdd(-sX.logX(10, ITEM.cost/2, '-'), CHAR); sX.giveFeedback('You snagged [' + ITEM.name + '] ...that was almost too easy.'); success=true; } else { sX.giveFeedback('you got caught, this is really bad... where will you go if you are banned?'); success=false; } if(success) { sX.addItem(item_id, CHAR); } sX.do_status_update(CHAR); return success; }, 'takeHome' : function(WHO, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('takeHome - NO CHAR!'); } WHO.captured = new Date; var WORLD=$G.WORLD; var slaveName = WHO.uid||WHO.name; var i=2; if(!WHO.uid) while(WORLD.NPCS[slaveName] || CHAR.SLAVES[slaveName]) { slaveName = WHO.name+' ('+ i +')'; i++; } WORLD.NPCS[slaveName] = WHO; CHAR.SLAVES[slaveName] = WHO; }, 'trainSTATS' : function(act, effort, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('trainSTATS - NO CHAR!'); } effort=sX.putInBounds(effort||1.0, 'trainSTATS-effort'); /* sX.statGet(stat, secAlias, CHAR); */ var S = sX.statGet('all', 'base', CHAR); var cost = 16000/(S.caliber+S.magnitude+S.order); /* sX.statGrow(stat, secAlias, trainAmt, CHAR); */ /* WORKOUT UNIQUE CODE: STR(END) END(SPD) SPD(PHY) PHY(INS) WSD(INS) STAT INCREASE FOR EFFORT */ sX.statGrow('STR', 'train', ( -( (act.tough||0) + (act.power||0) + (act.vigor||0) + (act.skill||0) + (act.train||0) )*effort /(cost*S.STR)), CHAR); sX.statGrow('PHY', 'train', ( -( (act.vigor||0) + (act.vital||0) + (act.metab||0) + (act.focus||0) + (act.aware||0) )*effort /(cost*S.PHY)), CHAR); sX.statGrow('WSD', 'train', ( -( (act.train||0) + (act.guard||0) + (act.react||0) + (act.aware||0) + (act.psych||0) )*effort /(cost*S.WSD)), CHAR); sX.statGrow('END', 'train', ( -( (act.tough||0) + (act.regen||0) + (act.vital||0) + (act.force||0) + (act.guard||0) )*effort /(cost*S.END)), CHAR); sX.statGrow('SPD', 'train', ( -( (act.power||0) + (act.regen||0) + (act.metab||0) + (act.fight||0) + (act.react||0) )*effort /(cost*S.SPD)), CHAR); sX.statGrow('INS', 'train', ( -( (act.skill||0) + (act.force||0) + (act.fight||0) + (act.focus||0) + (act.psych||0) )*effort /(cost*S.INS)), CHAR); }, 'updateConditions' : function(CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('updateConditions - NO CHAR!'); } Object.keys(setup.STATUSES).forEach(function(cond) { setup.STATUSES[cond](CHAR); }); }, 'useItem' : function(item_id, qty, OWNER, TARGET) { var sX=setup.ALIAS; OWNER=OWNER||$G.PC; qty=sX.putInBounds(qty||1, 'useItem-qty'); /* option to multi-use */ $G.PC.STATE.lastAction = 'use'; $G.PC.STATE.lastItem = item_id; /* sX.statGet(stat, secAlias, CHAR); */ var aS = sX.statGet('all', 'current', OWNER); var dS = sX.statGet('all', 'current', TARGET); /* do you even have one, bro? */ if(!OWNER.STUFF[item_id]) { return false; } if(('all'==qty)||('*'==qty)) { qty=OWNER.STUFF[item_id]; } sX.before_use(item_id, qty, OWNER); OWNER.STUFF[item_id]-=qty; var ITEM = sX.getItem(item_id); /* if shoe fits, vear it... */ var iType = setup.ROLES.ALL[ITEM.role].type; /* how is it we never finished this callback support? */ var onUse=setup.DATA.ONUSE[item_id]; if(typeof onUse==='function') { var msg=onUse(qty, TARGET, OWNER); /* was item special interface aborted? */ if(!msg) { return false; } if(msg) { sX.giveFeedback(msg); } } switch(iType) { /* if not, try eating it */ case 'wearable': sX.equipItem(item_id, TARGET); break; case 'consumable': var iMAT = ITEM.MATRIX; sX.doEnergyMATRIX(iMAT, qty, TARGET); switch(ITEM.role) { case 'food': case 'drink': sX.doNutritionMATRIX(iMAT, qty, TARGET); break; } sX.regenerateBody(0.01, qty/10, TARGET); break; default: /* or just put it on the mantle to look at */ } /* Adjust the clock */ sX.passTime(qty * 0.1/aS.SPD, OWNER); sX.passTime(qty * 0.1/dS.SPD, TARGET); sX.after_use(item_id, qty, OWNER); /* clean up inventory */ if(OWNER.STUFF[item_id]<1) { sX.delItem(item_id, OWNER); } sX.do_status_update(TARGET); return true; }, 'update_bodysize' : function(CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('update_bodysize - NO CHAR!'); } /* Variable Bodymass (VBM) is anything over 1 lb per inch of height can be either muscle or fat, the remainder is essential structures and organs */ var wt = sX.weightGet('base', CHAR); /* sX.statGet(stat, secAlias, CHAR); */ var S = sX.statGet('all', 'current', CHAR); CHAR.METRICS.scale = CHAR.METRICS.ht / CHAR.METRICS.base_ht; sX.weightCalc(CHAR); var bwt = sX.weightGet('scaled', CHAR); var VBM = sX.scale(wt-CHAR.METRICS.ht, 3, CHAR); var PHY_stack = (S.PHY+1)*(S.PHY/2); var VBM_toned = PHY_stack/(PHY_stack+VBM); CHAR.METRICS.BMI = (bwt/(sX.pow(CHAR.METRICS.ht, 2, '-'))*703); CHAR.METRICS.bodyfat = Math.min( (1-VBM_toned)*(VBM/bwt)*100, 100 ); CHAR.METRICS.bodytone = Math.min( ( VBM_toned )*(VBM/bwt)*100, 100 ); /* base calculations */ CHAR.M.BICEP['~cache'] = CHAR.METRICS.bicep = sX.metricCalc('bicep', CHAR); CHAR.M.QUADS['~cache'] = CHAR.METRICS.quads = sX.metricCalc('quads', CHAR); CHAR.M.CHEST['~cache'] = CHAR.METRICS.chest = sX.metricCalc('chest', CHAR); CHAR.M.WAIST['~cache'] = CHAR.METRICS.waist = sX.metricCalc('waist', CHAR); CHAR.M.HIPS['~cache'] = CHAR.METRICS.hips = sX.metricCalc('hips', CHAR); CHAR.M.PECS['~cache'] = CHAR.METRICS.pecs = sX.metricCalc('pecs', CHAR); CHAR.M.FOREARM['~cache'] = CHAR.METRICS.forearm = sX.metricCalc('forearm', CHAR); CHAR.M.CALF['~cache'] = CHAR.METRICS.calf = sX.metricCalc('calf', CHAR); CHAR.M.TITS['~cache'] = CHAR.METRICS.cup = sX.metricCalc('cup', CHAR); }, 'update_slaves' : function(CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('update_slaves - NO CHAR!'); } var thisUpdate = CHAR.STATE.Date.getTime(); var hoursPassed = 0; Object.keys(CHAR.SLAVES).forEach(function(slave) { hoursPassed = (thisUpdate - (CHAR.SLAVES[slave].lastUpdate || thisUpdate)) / (60*60*1000); /* have them rest, recover, train, and pass time here... based on their set activity; (auto-rest if unable to perform activity) */ CHAR.SLAVES[slave].lastUpdate = thisUpdate; }); }, 'update_world' : function(CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('update_world - NO CHAR!'); } var WORLD=$G.WORLD; var thisUpdate = CHAR.STATE.Date.getTime(); var hoursPassed = (thisUpdate - (CHAR.lastUpdate || thisUpdate)) / (60*60*1000); /* we seem to be hitting this limit far too quickly... */ WORLD.girlPower = Math.min(Math.max(0.1, WORLD.girlPower), 10**16, (($G.PC.S.CALC.Lv||100)*($G.PC.S.CALC.Mag||10))); WORLD.amazonIndex=WORLD.girlPower/10; WORLD.RATES.breastExpansion = (settings.mac_breastExpansion ? 1.0 : 0.001); WORLD.RATES.heightGain = (settings.mac_heightGain ? 1.0 : 0.001); sX.update_slaves(CHAR); CHAR.lastUpdate = thisUpdate; }, 'val' : function(metric, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('val - NO CHAR!'); } /* first try char_metric() */ var val = sX.char_metric(metric, CHAR); if(!val) { /* next check TRAITS */ val=CHAR.TRAITS[metric]; } if(!val) { /* next check STATS */ /* sX.statGet(stat, secAlias, CHAR); */ var S = sX.statGet('all', 'current', CHAR); val=S[metric]; } if(!val) { /* lastly, put place-holder */ val = sX.valMissing(metric); } return val; }, 'weather_getReport' : function() { var sX=setup.ALIAS; return sX.formatAsPct(sX.weather_getSunlight(), 3) + ' sunlight'; }, 'weather_getSunlight' : function(dateObj) { var sX=setup.ALIAS; var dateObj=dateObj||$G.PC.STATE.Date; var time = dateObj.getHours() + (dateObj.getMinutes()/60); var dawn = 6.0; var dusk = 18.0; var gradient = 0.0; var lightPct = 0; /* LUX is 10x stronger in sun than shade on clear days, and 1/10x on overcast days, sunset is 0.1% of noon */ /* LUX= 100,000 direct sunlight; 10,000 ambient daylight; 1,000 overcast; 100 dusk; 10 twilight; 1 moonlight */ /* indoor lighting is typically 200-500 LUX, with Hospital ORs running about 18,000 */ /* start 90 deg, zenith, every half down is 2/3 brightness */ var gradLight=false; switch(true) { /* if night, assume full moon for now */ case (time<dawn||time>dusk): lightPct=0.00001; break; /* otherwise take the gradient of the number of hours from noon */ case (time<12.0): gradLight=true; gradient=(time-(12-dawn))/(12-dawn); break; case (time>12.0): gradLight=true; gradient=((dusk-12)-time)/(dusk-12); break; default: lightPct=1.00000; break; } if(gradLight) { lightPct=sX.pow(2/3, sX.logX(2, 1/gradient, '-'), '-'); } $G.PC.STATE.WEATHER.Daylight = lightPct; /* the percentage daylight is 2/3 to the power of the log2 of the reciprocal of the gradient */ return lightPct; }, 'weightAdd' : function(sec, amt, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('weightAdd - NO CHAR!'); } switch(sec) { case 'base': /* split weight proportionally */ break; case 'fat': sX.m_add('WEIGHT', 'BODY', 'fat' , amt, CHAR); break; case 'muscle': sX.m_add('WEIGHT', 'BODY', 'muscle' , amt, CHAR); break; case 'bone': sX.m_add('WEIGHT', 'BODY', 'bone' , amt, CHAR); break; case 'organs': sX.m_add('WEIGHT', 'BODY', 'organs' , amt, CHAR); break; default: break; } sX.weightCalc(CHAR); }, 'weightAdjust' : function(hours, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('weightAdjust - NO CHAR!'); } sX.debugClear(); var bodymass = sX.calcBodyMass(CHAR); var E = CHAR.MATRIX; var M = CHAR.METRICS; var bwt = sX.weightGet('body', CHAR); /* RMR ~= 655 + (4.354x lbs wt) + (4.569x in ht) - (4.7x yr age) BMR ~= RMR * range(12, 19); 12 for no activity; 19+ for pro athlete Maintain ~= BMR * 0.8 Starvation Threshold ~= range(1200, 1600) for most people */ /* disabled until updated */ return null; var unbalanced = true; var loops = 0; /* ADJUST WEIGHT - rebalance, lose, then gain */ while( (bwt>(M.ht/2) )&&( unbalanced )&&( loops<(bodymass*hours/10) )&&( loops<(hours*10) )&&( loops<(M.wt/10) ) ) { unbalanced = false; loops++; /* convert sugar to/from protein */ if( ( (Math.abs(E.protein)+Math.abs(E.sugar))>M.wt*5 )&&( (E.protein*2)<E.sugar ) && ( E.sugar>0 ) ) { E.sugar -= (bodymass*0.01 * 0.9); E.protein += (bodymass*0.01 * 0.8); sX.debugLog(loops + ': protein*2<sugar; protein+sugar>weight*5; converted '+ (bodymass * 0.9) +'g sugar to '+(bodymass * 0.8)+'g protein'); unbalanced = true; } else if( ( (Math.abs(E.protein)+Math.abs(E.sugar))>M.wt*5 )&&( E.protein>(E.sugar*2) ) && ( E.protein>0 ) ) { E.protein -= (bodymass*0.01 * 0.8); E.sugar += (bodymass*0.01 * 0.9); sX.debugLog(loops + ': protein>sugar*2; protein+sugar>weight*5; converted '+ (bodymass * 0.8) +'g protein to '+(bodymass * 0.9)+'g sugar'); unbalanced = true; } /* convert sugar to/from kCal/ATP */ if(( (Math.abs(E.kcal)+Math.abs(E.sugar))>M.wt*30 )&&( (E.kcal<-100)&&(E.sugar>0) )) { E.kcal += (bodymass*0.01 * 12.0); E.sugar -= (bodymass*0.01 * 3.0); sX.debugLog(loops + ': sugar>0; kcal<-100; converted '+ (bodymass * 3.0) +'g sugar to '+(bodymass * 12.0)+' kCal'); unbalanced = true; } else if(( (Math.abs(E.kcal)+Math.abs(E.sugar))>M.wt*30 )&&( (E.kcal>5000)&&(E.sugar<200) )) { E.kcal -= (bodymass*0.01 * 12.0); E.sugar += (bodymass*0.01 * 3.0); sX.debugLog(loops + ': kcal>5000; sugar<200; converted '+ (bodymass * 12.0) +'kCal to '+(bodymass * 3.0)+'g sugar'); unbalanced = true; } /* convert protein to/from kCal/ATP */ if(( (Math.abs(E.kcal)+Math.abs(E.protein))>M.wt*10 )&&( (E.kcal<-100) && (E.protein>0) )) { E.kcal += (bodymass*0.01 * 4.5); E.protein -= (bodymass*0.01 * 1.0); sX.debugLog(loops + ': protein>0; kcal<-100; converted '+ (bodymass * 1.0) +'g protein to '+(bodymass * 4.5)+' kCal'); unbalanced = true; } else if(( (Math.abs(E.kcal)+Math.abs(E.protein))>M.wt*10 )&&( (E.kcal>5000)&&(E.protein<100) )) { E.kcal -= (bodymass*0.01 * 4.5); E.protein += (bodymass*0.01 * 1.0); sX.debugLog(loops + ': kcal>5000; protein<100; converted '+ (bodymass * 4.5) +'kCal to '+(bodymass * 1.0)+'g protein'); unbalanced = true; } /* lose/gain weight */ if( (E.kcal<-4000) || (E.sugar<-500) || (E.protein<-350) || ((E.sugar<-200)&&(E.kcal<-750)) || ((E.sugar<100)&&(E.kcal<-3000)) ) { M.wt -= 1; E.sugar += 675; E.kcal += 3375; E.protein += 370; bodymass = sX.calcBodyMass(CHAR); sX.debugLog(loops + ': lost a pound -- wt: '+ M.wt +'; metabolic-bodymass: '+ bodymass.toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1}) +'; kCal: '+ E.kcal +'; protein: '+ E.protein +'g; sugar: '+ E.sugar +'g;'); unbalanced = true; } else if( (E.kcal>3500) || (E.sugar>1000) || (E.protein>1000) || ((E.sugar>600)&&(E.kcal>2500)) || ((E.sugar>300)&&(E.kcal>6000)) ) { M.wt += 1; E.sugar -= 725; E.kcal -= 3625; E.protein -= 385; bodymass = sX.calcBodyMass(CHAR); sX.debugLog(loops + ': gained a pound -- wt: '+ M.wt +'; metabolic-bodymass: '+ bodymass.toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1}) +'; kCal: '+ E.kcal +'; protein: '+ E.protein +'g; sugar: '+ E.sugar +'g;'); unbalanced = true; } /* repeat until no rebalances trigger or too many cycles pass */ } }, 'weightCalc' : function(CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('weightCalc - NO CHAR!'); } /* do the damned update FIRST! */ if($G.PC.STATE.saveVersion<0.254 || !CHAR.S) { return null; } if(!(CHAR.M && CHAR.M.WEIGHT && CHAR.M.WEIGHT.BODY && CHAR.M.WEIGHT.CALC && CHAR.M.WEIGHT.CACHE)) { sX.weightConvert(CHAR, 0.0); } var trainPct = sX.weightCalcTone(CHAR); CHAR.M.WEIGHT.CALC.trainPct = trainPct; var scalePct = sX.weightCalcScale(CHAR); CHAR.M.WEIGHT.CALC.scale = scalePct; var S = sX.statGet('all', 'base', CHAR); var wtBody = CHAR.M.WEIGHT.BODY; var wtCache = CHAR.M.WEIGHT.CACHE; var wtScaled = CHAR.M.WEIGHT.SCALED; /* blame twine for not letting me access freshly set variables/object properties... so we have to create local javascript variables for EVERYTHING we might need inside the function */ var uS = { 'STR' : sX.unstack(S.STR), 'PHY' : sX.unstack(S.PHY), 'WSD' : sX.unstack(S.WSD), 'END' : sX.unstack(S.END), 'SPD' : sX.unstack(S.SPD), 'INS' : sX.unstack(S.INS), }; var wtc_fat = Math.max(0, wtBody.fat + uS.SPD*-3.0 + uS.END* 6.0 + uS.WSD*-1.0 + uS.PHY*-6.0 + uS.STR* 3.0 + uS.INS*-2.0 ); wtCache.fat = wtc_fat; var wtc_muscle = Math.max(0, wtBody.muscle + uS.SPD* 2.0 + uS.END* 2.0 + uS.WSD*-2.0 + uS.PHY* 4.0 + uS.STR* 6.0 + uS.INS*-1.0 + trainPct*5.0 ); wtCache.muscle = wtc_muscle; var wtc_bone = Math.max(0, wtBody.bone + uS.SPD* 0.2 + uS.END* 0.4 + uS.WSD* 0.0 + uS.PHY* 0.2 + uS.STR* 0.6 + uS.INS* 0.0 + trainPct*1.0 ); wtCache.bone = wtc_bone; var wtc_organs = Math.max(0, wtBody.organs + 0 ); wtCache.organs = wtc_organs; var wtc_body = wtc_fat + wtc_muscle + wtc_bone + wtc_organs; wtCache.body = wtc_body; var wtc_total = wtc_body + (wtCache.gear||0) + (wtCache.holding||0); wtCache.total = wtc_total; var fatPct = wtc_fat / wtc_body; CHAR.M.WEIGHT.CALC.fatPct = fatPct; var musclePct = wtc_muscle / wtc_body; CHAR.M.WEIGHT.CALC.musclePct = musclePct; var tonePct = (1.0-fatPct) * trainPct; CHAR.M.WEIGHT.CALC.tonePct = tonePct; var scaled = 0.0; var bwt = 0.0; Object.keys(wtCache).forEach(function(cacheVal) { scaled = sX.weightScaled(wtCache[cacheVal], scalePct); wtScaled[cacheVal] = scaled; if('body'==cacheVal) { bwt=scaled; } }); CHAR.M.WEIGHT.CALC.bmi = (bwt/(sX.pow(CHAR.METRICS.ht, 2, '-'))*703); CHAR.M.WEIGHT.updated = Date.now(); }, 'weightCalcScale' : function(CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('weightCalcScale - NO CHAR!'); } var ht = CHAR.METRICS.ht; var bio_scale = sX.pow( 1.50, sX.logX(2, ht/72, '-'), '-' ); return bio_scale; }, 'weightCalcTone' : function(CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('weightCalcTone - NO CHAR!'); } var i=0; var t=0; /* sX.statGet(stat, secAlias, CHAR); */ /* SOME FUCKING HOW THIS RETURNS "UNKNOWN" */ /* var cap = CHAR.S.CALC.Cap; */ var cap = sX.statGet('CALC', 'Cap', CHAR); /* skip this step if weight hasn^t finished updating */ var bodyfat = (CHAR.M.WEIGHT.updated ? sX.weightGet('bodyfat', CHAR) : null); var pctLean = (CHAR.M.WEIGHT.updated ? (1-bodyfat) : null); /* sX.WTF({ 'cap' : cap, 'bodyfat' : bodyfat, 'pctLean' : pctLean, 'CHAR.BODY' : CHAR.BODY, }); */ Object.keys(CHAR.BODY).forEach(function(part) { if('muscle'==setup.BODY[part].type) { i++; t+=CHAR.BODY[part].train; if(pctLean) { CHAR.BODY[part].tone = pctLean*CHAR.BODY[part].train/cap; } } }); return t/(i*cap); }, 'weightConvert' : function(CHAR, wtMod) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('weightConvert - NO CHAR!'); } wtMod=wtMod||0.0; if(!CHAR.M) { CHAR.M={}; } /* it has to be happening here... */ var dbg = ''; var wt = CHAR.METRICS.wt||150; dbg += '\nInitial weight: '+ wt; /* argghh! no stats! */ var str = sX.statGet('STR', 'base', CHAR)||1; dbg += '\nSTR: '+ str; wt = Math.max(wt/2, wt-str)*0.8; dbg += '\nReduced Weight: '+ wt; wt += wtMod; dbg += '\nModified Weight: '+ wt; sX.debugLog(dbg); /* for some reason, this person doesnt have stats yet... THEN FUCKING WAIT TO CONVERT THEM! */ if('undefined'==typeof(str)) { return null; } var orgMax = (CHAR.METRICS.ht||66)/1.5; var orgMin = (CHAR.METRICS.ht||66)/3.0; var orgSurp = Math.max(0, (wt*0.25)-orgMax)-Math.max(0, orgMin-(wt*0.25)); var phy = sX.statGet('PHY', 'base', CHAR)||1; var phyPct = phy/(phy+10); /* some-fucking-how, this is coming up NaN for NPCs! o_Ok number*number IS number!!! */ CHAR.M.WEIGHT={ 'BODY':{ /* adapt baseline human averages, convert current fitness method, and micro adjust for stat weights */ 'bone' : wt*(0.10 )+ 5, 'fat' : wt*(0.15+( 0.40*(1-phyPct) ) )-10, 'muscle' : wt*(0.10+( 0.40*( phyPct) ) )-10+orgSurp, 'organs' : wt*(0.25 )+ 5-orgSurp, }, 'GEAR':{ /* slot : { itemName, wt, ... } */ }, 'MODS':{ /* { name, exp, testCallback, expCallback, ... } */ 'muscle' : {}, 'bone' : {}, 'organs' : {}, 'fat' : {}, 'gear' : {}, 'holding' : {}, }, 'CALC':{ 'scale' : 1.0, 'tone' : 0.0, }, 'CACHE':{ 'body' : wt, 'gear' : 0, 'holding' : 0, 'total' : wt, }, 'SCALED':{ 'body' : wt, 'gear' : 0, 'holding' : 0, 'total' : wt, }, }; }, 'weightGet' : function(alias, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('weightGet - NO CHAR!'); } var targetWt = null; /* recalculate only if cache is missing or invalid */ if(!(CHAR.M && CHAR.M.WEIGHT && CHAR.M.WEIGHT.updated && CHAR.M.WEIGHT.BODY && CHAR.M.WEIGHT.CALC && CHAR.M.WEIGHT.CACHE && CHAR.M.WEIGHT.SCALED)) { sX.weightCalc(CHAR); } alias= alias.toLowerCase(); switch(alias) { case 'scaled': targetWt=sX.m_get('WEIGHT', 'SCALED', 'body', CHAR); break; case 'base': targetWt=sX.m_get('WEIGHT', 'CACHE', 'body', CHAR); break; case 'bmi': targetWt=sX.m_get('WEIGHT', 'CALC', alias, CHAR); break; case 'bodytone': targetWt=sX.m_get('WEIGHT', 'CALC', 'tonePct', CHAR); break; case 'bodyfat': targetWt=sX.m_get('WEIGHT', 'CALC', 'fatPct', CHAR); break; case 'body': case 'muscle': case 'fat': case 'bone': case 'organs': targetWt=sX.m_get('WEIGHT', 'SCALED', alias, CHAR); break; default: break; } /* scale all weight gainst a 6ft base height stat mus fat STR +3 +1 PHY +2 -1 WSD -2 -- END +1 +3 SPD -2 -1 INS -- -2 --------------------- net: +2 -- */ return targetWt; }, 'weightSetMax' : function(sec, maxAmt, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('weightSetMax - NO CHAR!'); } /* not compatible with new metrics */ return null; switch(sec) { case 'base': CHAR.METRICS.wt = Math.min(CHAR.METRICS.wt, maxAmt); break; default: break; } }, 'weightSetMin' : function(sec, minAmt, CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('weightSetMin - NO CHAR!'); } /* not compatible with new metrics */ return null; switch(sec) { case 'base': CHAR.METRICS.wt = Math.max(CHAR.METRICS.wt, minAmt); break; default: break; } }, /* END WEIGHT FUNCTIONS */ 'wildSurge' : function(CASTER, TARGET) { var sX=setup.ALIAS; var out = ''; $G.WORLD.girlPower += 0.16; /* sX.statGet(stat, secAlias, CHAR); */ var aS = sX.statGet('all', 'current', CASTER); var dS = sX.statGet('all', 'current', TARGET); var tGen = (TARGET.gender || TARGET.TRAITS.gender).toLowerCase(); var cGen = (CASTER.gender || CASTER.TRAITS.gender).toLowerCase(); var cCal = aS.caliber; var cSurge = sX.rand(cCal/6, cCal)/6; var tCal = dS.caliber; var tSurge = sX.rand(cCal/6, tCal); var foundShardsTARGET = sX.shardSpawn(TARGET, 'primal-magic', (0.69+($G.WORLD.amazonIndex/34))); var foundShardsCASTER = sX.shardSpawn(CASTER, 'primal-magic', (0.34+($G.WORLD.amazonIndex/34))); TARGET.R.S.primal = (TARGET.R.S.primal||0) +foundShardsTARGET; TARGET.Y.surgeTotal = (TARGET.Y.surgeTotal||0) +tSurge; CASTER.R.S.primal = (CASTER.R.S.primal||0) +foundShardsCASTER; CASTER.Y.surgeTotal = (CASTER.Y.surgeTotal||0) +cSurge; out += 'Primal Essence flows forth causing the cords under '+ TARGET.name_first +''s skin to twist and swell with newfound power...'; if( ((tGen=='male')||(tGen=='none')) && ( (TARGET.Y.surgeTotal>((dS.caliber+TARGET.R.S.primal)*dS.caliber)) || (TARGET.dead && (TARGET.MATRIX.qi<-dS.max_qi*dS.caliber)) ) ) { out += ' unfortunately for him, it is more than his pathetic male body can handle and his own muscles violently tear him apart.'; TARGET.dead = true; TARGET.gone = true; TARGET.CoD = 'too much power...'; sX.qiAdd(-aS.max_qi, TARGET); } else { /* ADD MUTATION BRANCH that creates Monsters and Metas... */ out += ' you can feel the power radiating from '+ sX.his_her(tGen) +' glorious new form!'; out += sX.wildSurge_boost(CASTER, TARGET, tSurge); } if(CASTER.name===$G.PC.name) { /* caster was player... */ out += ' The Primal Energies from the Surge cause your own muscles to swell as well...<br />'; switch(true) { case(1===foundShardsCASTER): out +=' A life-shard was produced!<br />'; break; case(1<foundShardsCASTER): out +=foundShardsCASTER+' life-shards were produced!<br />'; break; default: break; } out += sX.wildSurge_boost(CASTER, CASTER, cSurge); } else { /* do we need to describe a hidden caster? */ out += ''; } return out; }, 'wildSurge_boost' : function(CASTER, TARGET, amt) { var sX=setup.ALIAS; amt=sX.putInBounds(amt, 'wildSurge_boost-amt'); /* sX.statGet(stat, secAlias, CHAR); */ var aS = sX.statGet('all', 'current', CASTER); var dS = sX.statGet('all', 'current', TARGET); var out = ''; var you = (TARGET.name==$G.PC.name); var ht_plus1 = 0; var ht_plus2 = 0; var regrow = 0; var gain = 0; var expectedTargetQi = TARGET.MATRIX.qi; var qiAdd = aS.max_qi*3; var qiAddFD = aS.max_qi*aS.caliber*aS.magnitude; var beRate = $G.WORLD.RATES.breastExpansion; var hgRate = $G.WORLD.RATES.heightGain; var gender = (TARGET.gender || TARGET.TRAITS.gender).toLowerCase(); if(TARGET.dead) { switch(gender) { case 'female': case 'futa': /* do the heal first, so we can see where it leaves us... */ sX.qiAdd(qiAddFD, TARGET); /* ...and yet we cannot TRUST sugarcube to perform that qiAdd BEFORE the code below it, so... */ expectedTargetQi+=qiAddFD; switch(true) { /* full-strength */ case (TARGET.MATRIX.qi>=dS.max_qi*0.7): TARGET.dead = false; TARGET.CoD = null; TARGET.stun = false; TARGET.ko = false; out += ' Within seconds she is fully healed and back on her feet, a distant look in her eye as though contemplating her newly enhanced physique and the true nature of power...'; break; /* conscious */ case (expectedTargetQi>0): TARGET.dead = false; TARGET.CoD = null; TARGET.stun = false; TARGET.ko = false; out += ' Still weakened from her brief visit to the afterlife, '+ TARGET.name_first + ' begins to stir- as she stands she has a far away gaze, as though her mind were still elsewhere...'; break; /* alive -- WHY THE FUCK ISNT THIS TRIGGERING????????????????????? */ case (expectedTargetQi>-dS.max_qi*dS.capacity): TARGET.dead = false; TARGET.CoD = null; out += ' '+ TARGET.name_first + ''s wounds shrink as her muscles grow; her chest again begins rising and falling with each powerful breath. She may still be unconscious, but you can feel the raw primal energy radiating from her.'; break; /* still dead */ default: out += ' Her body reacts favorably to the surge, unfortunately it's not enough to bring her back yet...'; break; } break; case 'male': case 'none': default: /* nope... not strong enough to come back... */ return ''; break; } } else { /* proceed with the heal... */ sX.qiAdd((aS.max_qi*16 + dS.max_qi*6 -expectedTargetQi/34), TARGET); } sX.statGrow('STR', 'primal', sX.rand(0.4, 2.1)*(amt*6), TARGET); sX.statGrow('PHY', 'primal', sX.rand(0.3, 1.7)*(amt*6), TARGET); sX.statGrow('WSD', 'primal', sX.rand(0.1, 0.5)*(amt*6), TARGET); sX.statGrow('END', 'primal', sX.rand(0.3, 1.9)*(amt*6), TARGET); sX.statGrow('SPD', 'primal', sX.rand(0.2, 0.9)*(amt*6), TARGET); sX.statGrow('INS', 'primal', sX.rand(0.1, 0.5)*(amt*6), TARGET); sX.wildSurge_muscleBurst(TARGET, amt); switch(true) { case (TARGET.METRICS.age<16): var age_plus = sX.rand(0.1, (24.0-TARGET.METRICS.age)/3.4); TARGET.METRICS.bust += sX.unstack(age_plus)*sX.rand(0.16, 1.34); ht_plus2 = sX.stack(age_plus); TARGET.METRICS.age+=age_plus; TARGET.METRICS.ht += ht_plus2; out += ' Before your eyes '+ (you ? 'your body' : sX.he_she(gender)) +' matures and grows '+ sX.formatHeight(ht_plus2) + ' taller, filling out in all the right ways...'; break; case (TARGET.METRICS.age>24): var age_minus = (TARGET.METRICS.age-16)/6; TARGET.METRICS.age-= age_minus; out += ' You watch as the years seem to melt off'; ht_plus2 = hgRate*sX.unstack(age_minus); TARGET.METRICS.ht += hgRate*ht_plus2; if(settings.mac_heightGain) { out += ' and '+ (you ? 'you even grow ' : TARGET.name_first +' even grows ')+ sX.formatHeight(ht_plus2); } out += ', everything tightening and firming up...'; break; } TARGET.age = TARGET.METRICS.age; out += ' '+ (you ? 'You continue' : TARGET.name_first +' continues')+' to grow'; ht_plus1 = sX.unstack(amt*sX.rand(0.1, 1.6)); TARGET.METRICS.ht += hgRate*ht_plus1; if(settings.mac_heightGain) { out += ', surging up another '+ sX.formatHeight(ht_plus1); } if((('female'==gender)||('futa'==gender))) { TARGET.METRICS.bust += beRate*ht_plus1*sX.rand(0.16, 1.34); /* output message about BE? */ } out += ', '+(you ? 'your' : sX.his_her(gender)) +' already impressive muscles swell obscenely, with thick veins snaking across titanic peaks.'; return out; }, 'wildSurge_muscleBurst' : function(TARGET, amt) { var sX=setup.ALIAS; var dS = sX.statGet('all', 'current', TARGET); var regrow=0; var gain=0; Object.keys(setup.BODY).forEach(function(key) { if(setup.BODY[key].type=='muscle') { regrow = Math.min(TARGET.BODY[key].damage, sX.rand(0.06, 1.34)*dS.capacity); TARGET.BODY[key].damage -= regrow; gain = Math.min(sX.sqrt(dS.capacity, '-'), Math.max(1, (regrow/dS.capacity) + (sX.rand(0.06, 1.34)*(amt/42)))); TARGET.BODY[key].train += gain; TARGET.BODY[key].train = Math.min(TARGET.BODY[key].train, dS.capacity); } }); }, 'workoutTable' : function(activity, HOURS, LEVELS, CHAR) { var sX=setup.ALIAS; LEVELS=LEVELS||{'light':0.5,'medium':1.0,'heavy':2.0}; HOURS=HOURS||{'auto':0,'quick':5/60,'short':20/60,'moderate':60/60,'long':180/60,'max':0}; if(!CHAR) { sX.debugLog('workoutTable - NO CHAR!'); } /* sX.statGet(stat, secAlias, CHAR); */ var S = sX.statGet('all', 'current', CHAR); var hrs = 0.0; var twine_link = ''; var max_hours = 0.0; var link_table = "<table class='workout'><tr><th></th>"; Object.keys(HOURS).forEach(function(h){ link_table += '<th>'+ h +'</th>'; }); link_table += '</tr>'; Object.keys(LEVELS).forEach(function(lv){ link_table += '<tr><th>'+ lv + '</th>'; max_hours = sX.maxHours('TRAIN', activity, LEVELS[lv], CHAR); Object.keys(HOURS).forEach(function(h){ switch(h) { case 'auto': hrs = S.workout_hrs; break; case 'max': hrs = max_hours; break; default: hrs = HOURS[h]; break; } twine_link = ((hrs>max_hours) ? '<hr/>' : "<<link '"+ (hrs*60).toLocaleString(undefined, {minimumFractionDigits: 1, maximumFractionDigits: 1}) + ' min' + "'>>" +"<<set _hrs = "+ hrs +">><<set _lv = "+ LEVELS[lv] +">>" +"<<replace '#passages'>><<include '"+ State.passage +"'>><</replace>>" +"<</link>>"); link_table += '<td>'+ twine_link +'</td>'; }); link_table += "</tr>\n"; }); link_table += '</table>'; return link_table; }, 'worldVarAdd' : function(varname, addValue) { return ($G.WORLD.VARS[varname]=($G.WORLD.VARS[varname]||0)+addValue); }, 'worldVarGet' : function(varname, defaultValue) { if(typeof defaultValue==='undefined') { defaultValue=null; }; return $G.WORLD.VARS[varname]||defaultValue; }, 'worldVarSet' : function(varname, setValue) { return ($G.WORLD.VARS[varname]=setValue); }, 'write_epitaph' : function(CHAR) { var sX=setup.ALIAS; if(!CHAR) { sX.debugLog('write_epitaph - NO CHAR!'); } return ((CHAR.PASSAGES && CHAR.PASSAGES.epitaph) ? "<<include '"+ CHAR.PASSAGES.epitaph +"'>>" : 'R.I.P.') + sX.secondChance(CHAR); }, };>>
<<set _time=setup.ALIAS.getTime('24'); >> <<replace '#datetime'>><<include 'DATETIME'>><</replace>> <<if (_time>'07:59')&&(_time<'16:59') >> <<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <h2>WESTERN RIVER VALLEY CORRECTIONAL FACILITY</h2> <</if>> <<print setup.ALIAS.afterPassage();>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>> <p></p> <<print setup.ALIAS.exitPassage();>> <<else>> <<print setup.ALIAS.setupPassage();>><<print setup.ALIAS.beforePassage();>> <<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ALIAS.replacePassage();>><<else>> <p>You see a sign that reads, "SORRY, WE'RE CLOSED RIGHT NOW. PLEASE COME BACK DURING NORMAL VISITAION HOURS 08:00 AM - 05:00 PM".</p> <p>What do you do?</p> <div><<print setup.ALIAS.exitPassage();>></div> <</if>> <</if>> <<if settings.debugModeInfo>><p>[encounter: _encounter ]</p><</if>>
<<set setup.DATA.OPTIONS={ 'difficultyLevels' : { 'EasyLife' :{ 'label':'EasyLife', 'level': 0.42, 'build_lv':'public', }, 'NormalLife' :{ 'label':'NormalLife', 'level': 1.00, 'build_lv':'public', }, 'RoughLife' :{ 'label':'RoughLife', 'level': 1.69, 'build_lv':'public', }, 'HardLife' :{ 'label':'HardLife', 'level': 3.16, 'build_lv':'public', }, 'BadLife' :{ 'label':'BadLife', 'level': 6.00, 'build_lv':'public', }, }, }>>
<<set setup.DATA.SPECIES={ 'species.human':{'uid':'species.human','species':'human:1.0','race':'human:1.0','display':'human «gender»','body':'humanoid','organs':'terrestrial','metabolism':'sugar:0.5; protein:0.5','sex':'xx:0.51; xy:0.48; zx:0.006; zy:0.003; zz:0.001','age':':14~84','height':':66$1.5|gen=m:+2|gen=f:-2','WEIGHT.base':'muscle:30|gen=m:+15$2; fat:20|gen=f:+10$3; bone:15; organs:25','level':':7|~3|gen=m:+2','STATS.base':'*:+0.1$0.15; SPD|PHY|STR:gen=m:+3~5; END|WSD|INS:gen=f:+3~5; *:+«Mag»|!<«Mag»','STATS.PERM':'*:~1; train:gen=m:+2; evolve:gen=f:+3','METRICS':'bust:1$0.5|gen=m:0','powers':'','attire':'casual:0.40; athletic:0.20; work:0.20; posh:0.10; rags:0.03; beachwear:0.05; leather:0.02; underwear:0.01; fetish:0.01; nude:0.01; random:0.01','EQUIP':'','STUFF':'wallet:0.7',}, 'species.human.rvh_student':{'uid':'species.human.rvh_student','species':'human:1.0','race':'human:1.0','display':'«gender» student','body':'humanoid','organs':'terrestrial','metabolism':'sugar:0.5; protein:0.5','sex':'xx:0.54; xy:0.36; zx:0.06; zy:0.03; zz:0.01','age':':14~18','height':':66$1.5|gen=m:+2|gen=f:-2','WEIGHT.base':'muscle:30|gen=m:+15$2; fat:20|gen=f:+10$3; bone:15; organs:25','level':':9|~4|gen=f:+7','STATS.base':'*:+2$0.42; SPD|PHY|STR:gen=f:+6~9; END|WSD|INS:gen=f:+4~6; *:+«Mag»|!<«Mag»','STATS.PERM':'*:~4; train:gen=m:+2; evolve:gen=f:+5','METRICS':'bust:1.34$0.69|gen=m:0','powers':'xSTR|xPHY|xWSD|xEND|xSPD|xINS:=-3|gen=f:
[email protected]
','attire':'casual:0.50; athletic:0.20; work:0.05; posh:0.20; rags:0.03; leather:0.02','EQUIP':'','STUFF':'wallet:0.7',}, 'species.human.gym_goer':{'uid':'species.human.gym_goer','species':'human:1.0','race':'human:1.0','display':'«gender» gym goer','body':'humanoid','organs':'terrestrial','metabolism':'sugar:0.5; protein:0.5','sex':'xx:0.34; xy:0.56; zx:0.06; zy:0.03; zz:0.01','age':':16~64','height':':66$1.5|gen=m:+2|gen=f:-2','WEIGHT.base':'muscle:30|gen=m:+15$2; fat:20|gen=f:+10$3; bone:15; organs:25','level':':12|~8|gen=m:+4','STATS.base':'*:+3$0.34; SPD|PHY|STR:gen=m:+3~5; END|WSD|INS:gen=f:+3~5; *:+«Mag»|!<«Mag»','STATS.PERM':'*:~2; train:gen=m:+2; evolve:gen=f:+6','METRICS':'bust:1$0.35|gen=m:0','powers':'','attire':'casual:0.20; athletic:0.45; work:0.10; posh:0.10; rags:0.03; beachwear:0.15; leather:0.02','EQUIP':'','STUFF':'wallet:0.7',}, 'species.human.inmate':{'uid':'species.human.inmate','species':'human:1.0','race':'human:1.0','display':'«gender» inmate','body':'humanoid','organs':'terrestrial','metabolism':'sugar:0.5; protein:0.5','sex':'xx:0.69; xy:0.21; zx:0.06; zy:0.03; zz:0.01','age':':18~54','height':':66$1.5|gen=m:+2|gen=f:-2','WEIGHT.base':'muscle:30|gen=m:+15$2; fat:20|gen=f:+10$3; bone:15; organs:25','level':':13|~4|gen=f:+6','STATS.base':'*:+4$0.23; SPD|PHY|STR:gen=f:+4~6; END|WSD|INS:gen=f:+2~3; *:+«Mag»|!<«Mag»','STATS.PERM':'*:~3; train:gen=m:+2; train|evolve:gen=f:+6','METRICS':'bust:1.42$0.84|gen=m:0','powers':'xSTR|xPHY|xWSD|xEND|xSPD|xINS:=-1|gen=f:
[email protected]
','attire':'uniform:0.40; casual:0.10; athletic:0.20; work:0.10; rags:0.03; underwear:0.04; nude:0.02; random:0.01','EQUIP':'','STUFF':'',}, 'species.vampire':{'uid':'species.vampire','species':'demon:0.5; human:0.5','race':'vampire:1.0','display':'«gender» vampire','body':'humanoid','organs':'vampyric','metabolism':'blood:1.0','sex':'xx:0.34; xy:0.56; zx:0.06; zy:0.03; zz:0.01','age':':10|^-1.6$0.4|*16~69|+34$6|!<14','height':':69$1.5|gen=m:+2|gen=f:-2|+«age»/200','WEIGHT.base':'muscle:50; fat:10; bone:10; organs:15','level':':«age»| /10| +30','STATS.base':'*:+6$4; END|STR:+20; SPD|INS: +10; WSD|PHY: -10; *:gen=f:*1.69; *:!<«Mag»|+«Cal»','STATS.PERM':'*:~10; health:-10','METRICS':'bust:2$0.4|gen=m:0','powers':'xSTR|xEND|xSPD|xINS:=-6|+«age»/200|+0$0.34|gen=f:+3|!>«Cal»|!<-1|\\1','attire':'casual:0.40; athletic:0.20; work:0.20; posh:0.10; rags:0.03; beachwear:0.05; leather:0.02; underwear:0.01; fetish:0.01; nude:0.01; random:0.01','EQUIP':'','STUFF':'bloodshards:0.3',}, }>>
<<set setup.DATA.ONUSE={ 'items.Supplements.AMAZone' : function(qty, TARGET) { qty=qty||1; var sE=setup.ALIAS; var tS = sE.statGet('calc', 'current', TARGET); var f = ('she'===sE.he_she(TARGET.TRAITS.gender)); var fm = (f ? 1 : -1); var bp = $G.WORLD.amazonIndex/tS.caliber/100; $G.WORLD.girlPower+=qty*bp; sE.weightAdd('muscle', qty*fm*tS.caliber, TARGET); sE.statGrow('all', 'genes', qty*fm*(tS.magnitude+bp), TARGET); TARGET.METRICS.ht+= qty*fm*tS.magnitude*$G.WORLD.RATES.heightGain; if(f) { TARGET.METRICS.bust+= qty*tS.magnitude/6*$G.WORLD.RATES.breastExpansion; } if(TARGET.METRICS.age>(19+qty*bp)) { TARGET.METRICS.age-=qty*fm*bp; } sE.wildSurge_muscleBurst(TARGET, qty*fm*(tS.magnitude+bp)); return (TARGET.NAMES.first+" took A-MA Zone... "+(f ? 'her body reacted favorably...' : 'his body is not reacting well...' )); }, 'items.Supplements.DeviLabs' : function(qty, TARGET) { qty=qty||1; var sE=setup.ALIAS; var tS = sE.statGet('calc', 'current', TARGET); var f = ('she'===sE.he_she(TARGET.TRAITS.gender)); if(f) { TARGET.METRICS.bust+= qty*tS.magnitude/16*$G.WORLD.RATES.breastExpansion; } sE.weightAdd('fat', -qty*tS.caliber, TARGET); sE.statGrow('all', 'health', -qty*tS.order, TARGET); return (TARGET.NAMES.first+" took DeviLabs... you swear you can smell the smoke as the fat melts away..."); }, 'items.Supplements.BCAAs' : function(qty, TARGET) {}, 'items.Supplements.Creatine' : function(qty, TARGET) {}, 'items.Supplements.Protein' : function(qty, TARGET) {}, 'items.Supplements.Riods' : function(qty, TARGET) {}, 'items.Supplements.XXXX' : function(qty, TARGET) {}, 'items.Books.MagicTheory' : function(qty, TARGET) {}, 'items.Books.XXXX' : function(qty, TARGET) {}, 'items.Candles.Warding' : function(qty, TARGET) {}, 'items.Candles.XXXX' : function(qty, TARGET) {}, 'items.Crystals.XXXX' : function(qty, TARGET) {}, 'items.Oils.Toning' : function(qty, TARGET) {}, 'items.Oils.Supple' : function(qty, TARGET) {}, 'items.Oils.Engorgement' : function(qty, TARGET) { qty=qty||1; var sE=setup.ALIAS; var f = ('she'===sE.he_she(TARGET.TRAITS.gender)); var you=(TARGET.NAMES===$G.PC.NAMES); var them=sE.him_her(TARGET.TRAITS.gender); var their=sE.his_her(TARGET.TRAITS.gender); var msg="You rub the oil on " +(you ? 'yourself' : TARGET.NAMES.first) +", massaging and kneading deep into " +(you ? 'your' : their) +" flesh, as you " +(you ? '' : 'watch '+them)+' ' +"try to suppress a moan... within seconds, the area " +"engorges, becoming almost uncomfortably warm as the tissues begin growing."; var uid = 'choices-' + Date.now(); var i=0; var dialog="<div id='"+ uid +"'><ul class='choices'>"; State.setVar('_TARGET', TARGET); ['bicep', 'forearm', 'quads', 'calf', 'chest', 'waist', 'hips', 'pecs', 'tits'].forEach(function(region) { i++; dialog += "<li class='keypress' key='"+(i)+"'><<link '"+ region +"'>>"; dialog += "<<run setup.ALIAS.metricTrain('"+ region +"', 'oil', "+ 0.34*qty +", _TARGET);>>"; dialog += "<<replace '#"+ uid +"'>>"+ msg +"<</replace>>"; dialog += "<<run setup.ALIAS.do_status_update(_TARGET);>>"; dialog += "<</link>></li>"; }); dialog += "</ul></div>"; return sE.dialog_showAs(dialog); }, 'items.Oils.Withering' : function(qty, TARGET) { qty=qty||1; var sE=setup.ALIAS; var f = ('she'===sE.he_she(TARGET.TRAITS.gender)); var you=(TARGET.NAMES===$G.PC.NAMES); var them=sE.him_her(TARGET.TRAITS.gender); var their=sE.his_her(TARGET.TRAITS.gender); var msg="You rub the oil on " +(you ? 'yourself' : TARGET.NAMES.first) +", massaging and kneading deep into " +(you ? 'your' : their) +" flesh, as you " +(you ? '' : 'watch '+them)+' ' +"try to suppress a moan... within seconds, the area " +"withers, becoming almost uncomfortably cold as the tissues begin shrinking."; var uid = 'choices-' + Date.now(); var i=0; var dialog="<div id='"+ uid +"'><ul class='choices'>"; State.setVar('_TARGET', TARGET); ['bicep', 'forearm', 'quads', 'calf', 'chest', 'waist', 'hips', 'pecs', 'tits'].forEach(function(region) { i++; dialog += "<li class='keypress' key='"+(i)+"'><<link '"+ region +"'>>"; dialog += "<<run setup.ALIAS.metricTrain('"+ region +"', 'oil', "+ -0.16*qty +", _TARGET);>>"; dialog += "<<replace '#"+ uid +"'>>"+ msg +"<</replace>>"; dialog += "<<run setup.ALIAS.do_status_update(_TARGET);>>"; dialog += "<</link>></li>"; }); dialog += "</ul></div>"; return sE.dialog_showAs(dialog); }, 'items.Oils.XXXX' : function(qty, TARGET) {}, 'items.Balms.Healing' : function(qty, TARGET) {}, 'items.Balms.XXXX' : function(qty, TARGET) {}, 'items.Potions.Elixir' : function(qty, TARGET) {}, 'items.Potions.Giantess' : function(qty, TARGET) {}, 'items.Potions.Pygmy' : function(qty, TARGET) {}, 'items.Potions.Tigress' : function(qty, TARGET) {}, 'items.Potions.Walrus' : function(qty, TARGET) {}, 'items.Potions.Falcon' : function(qty, TARGET) {}, 'items.Potions.Passion' : function(qty, TARGET) {}, 'items.Potions.Wisdom' : function(qty, TARGET) {}, 'items.Potions.XXXX' : function(qty, TARGET) {}, 'items.XXXX' : function(qty, TARGET) {}, }>>
<<set setup.DATA.NPCS={ }>>