Your browser lacks required capabilities. Please upgrade it or switch to another to continue.
<br/>
<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.ENGINE.gameVersion()>>)</span>
<div style='font-size: 0.42em; font-weight: normal; opacity: 0.42;'>( <<print setup.ENGINE.gameVersion('full')>> )</div>
</h1>
<br/>
<br/>
<p class='sub-title'><big>select your character</big></p>
<br/>
<br/>
<p><<print setup.ENGINE.char_select_menu()>></p><<print setup.ENGINE.setupPassage();>><<print setup.ENGINE.beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENGINE.replacePassage();>><<else>>
<<run setup.ENGINE.doRest('sleep', 5); >><<set _time = setup.ENGINE.getTime();>>
<<if ("05:30"<_time)&&(_time<"07:30")>>
<<run setup.ENGINE.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.ENGINE.afterPassage();>>
<<if settings.debugInfo>><p>[encounter: _encounter ]</p><</if>>
<p></p>
<<print setup.ENGINE.exitPassage();>> <<if (_hrs) && (_lv)>>
<<print setup.ENGINE.setupPassage();>><<print setup.ENGINE.beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENGINE.replacePassage();>><<else>>
<<run setup.ENGINE.doWorkout('run', _hrs, _lv); >>
<<replace '#datetime'>><<include 'DATETIME'>><</replace>>
<p><<print setup.ENGINE.descMissing('RUN DISTANCE');>></p>
<p></p>
<</if>>
<<print setup.ENGINE.afterPassage();>>
<<if settings.debugInfo>><p>[encounter: _encounter ]</p><</if>>
<p></p>
<<print setup.ENGINE.exitPassage();>>
<<else>>
<<print setup.ENGINE.workoutTable('run'); >>
<p class='keypress' key='[SPACE]'>[[RETURN->GO HOME]]</p>
<</if>><<print setup.ENGINE.setupPassage();>><<print setup.ENCOUNTERS[_encounter].beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENCOUNTERS[_encounter].replacePassage(); >><<else>>
<<run setup.ENGINE.doExplore('search', 20/60); >>
<<set _found to setup.ENGINE.findChange(30, 300, true) >>
<<set $GAMEDATA.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.debugInfo>><p>[encounter: _encounter ]</p><</if>>
<<print setup.ENGINE.exitPassage();>><<print setup.ENGINE.setupPassage();>><<print setup.ENGINE.beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENGINE.replacePassage();>><<else>>
<<run setup.ENGINE.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.ENGINE.afterPassage();>>
<<if settings.debugInfo>><p>[encounter: _encounter ]</p><</if>>
<p></p>
<<print setup.ENGINE.exitPassage();>><<run setup.ENGINE.do_status_update();>>
<<print setup.ENGINE.setupPassage();>><<print setup.ENGINE.beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>>
<<print setup.ENGINE.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.ENGINE.afterPassage();>>
<<if settings.debugInfo>><p>[encounter: _encounter ]</p><</if>>
<<print setup.ENGINE.exitPassage();>><<print setup.ENGINE.setupPassage();>><<print setup.ENGINE.beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENGINE.replacePassage();>><<else>>
<<set _max_workout = Math.max(0, setup.ENGINE.maxHours('TRAIN', $GAMEDATA.PC.STATE.lastExercise))>>
<<set _minutes = (_max_workout * 60).toFixed(1)>>
<<run setup.ENGINE.doWorkout($GAMEDATA.PC.STATE.lastExercise, _max_workout); >>
<<run setup.ENGINE.doRest("sleep", 10/60); >>
<<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.ENGINE.afterPassage();>>
<<if settings.debugInfo>><p>[encounter: _encounter ]</p><</if>>
<p></p>
<<print setup.ENGINE.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.ENGINE.menuList_long(); >>
</div>Double-click this passage to edit it.Double-click this passage to edit it.<<print setup.ENGINE.setupPassage();>><<print setup.ENGINE.beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENGINE.replacePassage();>><<else>>
<<set _dept = "D01">><<include 'LIST AISLES FOR DEPT'>>
<</if>>
<<print setup.ENGINE.afterPassage();>>
<<if settings.debugInfo>><p>[encounter: _encounter ]</p><</if>>
<p></p>
<<print setup.ENGINE.exitPassage();>><<print setup.ENGINE.setupPassage();>><<print setup.ENGINE.beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENGINE.replacePassage();>><<else>>
<<set _dept = "D02">><<include 'LIST AISLES FOR DEPT'>>
<</if>>
<<print setup.ENGINE.afterPassage();>>
<<if settings.debugInfo>><p>[encounter: _encounter ]</p><</if>>
<p></p>
<<print setup.ENGINE.exitPassage();>><<print setup.ENGINE.setupPassage();>><<print setup.ENGINE.beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENGINE.replacePassage();>><<else>>
<<set _dept = "D03">><<include 'LIST AISLES FOR DEPT'>>
<</if>>
<<print setup.ENGINE.afterPassage();>>
<<if settings.debugInfo>><p>[encounter: _encounter ]</p><</if>>
<p></p>
<<print setup.ENGINE.exitPassage();>><<print setup.ENGINE.setupPassage();>><<print setup.ENGINE.beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENGINE.replacePassage();>><<else>>
<<set _dept = "D04">><<include 'LIST AISLES FOR DEPT'>>
<</if>>
<<print setup.ENGINE.afterPassage();>>
<<if settings.debugInfo>><p>[encounter: _encounter ]</p><</if>>
<p></p>
<<print setup.ENGINE.exitPassage();>><<print setup.ENGINE.setupPassage();>><<print setup.ENGINE.beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENGINE.replacePassage();>><<else>>
<<set _dept = "D05">><<include 'LIST AISLES FOR DEPT'>>
<</if>>
<<print setup.ENGINE.afterPassage();>>
<<if settings.debugInfo>><p>[encounter: _encounter ]</p><</if>>
<p></p>
<<print setup.ENGINE.exitPassage();>><<print setup.ENGINE.setupPassage();>><<print setup.ENGINE.beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENGINE.replacePassage();>><<else>>
<<set _dept = "D07">><<include 'LIST AISLES FOR DEPT'>>
<</if>>
<<print setup.ENGINE.afterPassage();>>
<<if settings.debugInfo>><p>[encounter: _encounter ]</p><</if>>
<p></p>
<<print setup.ENGINE.exitPassage();>><<print setup.ENGINE.setupPassage();>><<print setup.ENGINE.beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENGINE.replacePassage();>><<else>>
<<set _dept = "D08">><<include 'LIST AISLES FOR DEPT'>>
<</if>>
<<print setup.ENGINE.afterPassage();>>
<<if settings.debugInfo>><p>[encounter: _encounter ]</p><</if>>
<p></p>
<<print setup.ENGINE.exitPassage();>><<print setup.ENGINE.setupPassage();>><<print setup.ENGINE.beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENGINE.replacePassage();>><<else>>
<<set _dept = "D09">><<include 'LIST AISLES FOR DEPT'>>
<</if>>
<<print setup.ENGINE.afterPassage();>>
<<if settings.debugInfo>><p>[encounter: _encounter ]</p><</if>>
<p></p>
<<print setup.ENGINE.exitPassage();>><<print setup.ENGINE.setupPassage();>><<print setup.ENGINE.beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENGINE.replacePassage();>><<else>>
<<set _dept = "D11">><<include 'LIST AISLES FOR DEPT'>>
<</if>>
<<print setup.ENGINE.afterPassage();>>
<<if settings.debugInfo>><p>[encounter: _encounter ]</p><</if>>
<p></p>
<<print setup.ENGINE.exitPassage();>><<print setup.ENGINE.setupPassage();>><<print setup.ENGINE.beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENGINE.replacePassage();>><<else>>
<<set _dept = "D13">><<include 'LIST AISLES FOR DEPT'>>
<</if>>
<<print setup.ENGINE.afterPassage();>>
<<if settings.debugInfo>><p>[encounter: _encounter ]</p><</if>>
<p></p>
<<print setup.ENGINE.exitPassage();>><<print setup.ENGINE.setupPassage();>><<print setup.ENGINE.beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENGINE.replacePassage();>><<else>>
<p>You ask for an application and are immediately told they are under a hiring freeze.</p>
<</if>>
<<print setup.ENGINE.afterPassage();>>
<<if settings.debugInfo>><p>[encounter: _encounter ]</p><</if>>
<p></p>
<<print setup.ENGINE.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.ENGINE.menuHide();>><div class='left framed'>
<h4>RESOURCES</h4>
<div class='resources'>
<<print setup.ENGINE.getResource('kcal') >>
<<print setup.ENGINE.getResource('protein') >>
<<print setup.ENGINE.getResource('sugar') >>
<p></p>
<<print setup.ENGINE.getResource('petro') >>
<<print setup.ENGINE.getResource('money') >>
<p></p>
<<print setup.ENGINE.getResource('light') >>
<<print setup.ENGINE.getResource('dark') >>
<<print setup.ENGINE.getResource('qi') >>
<p></p>
<<if settings.lod_energyMatrix>>
<div class='energy-matrix half-glass'>
<<print setup.ENGINE.getResource('regen') >>
<<print setup.ENGINE.getResource('react') >>
<<print setup.ENGINE.getResource('metab') >>
<<print setup.ENGINE.getResource('power') >>
<<print setup.ENGINE.getResource('fight') >>
<<print setup.ENGINE.getResource('guard') >>
<<print setup.ENGINE.getResource('vital') >>
<<print setup.ENGINE.getResource('tough') >>
<<print setup.ENGINE.getResource('force') >>
<<print setup.ENGINE.getResource('aware') >>
<<print setup.ENGINE.getResource('train') >>
<<print setup.ENGINE.getResource('psych') >>
<<print setup.ENGINE.getResource('vigor') >>
<<print setup.ENGINE.getResource('focus') >>
<<print setup.ENGINE.getResource('skill') >>
</div>
<</if>>
</div>
</div><div class='left framed'>
<h4>STATS / METRICS</h4>
<table class='stats'>
<tr> <th><<print setup.ENGINE.karmic_link('SPD')>>:</th> <th><<print setup.ENGINE.statPrint('SPD', $GAMEDATA.PC); >></th> </tr>
<tr> <th><<print setup.ENGINE.karmic_link('END')>>:</th> <th><<print setup.ENGINE.statPrint('END', $GAMEDATA.PC); >></th> </tr>
<tr> <th><<print setup.ENGINE.karmic_link('WSD')>>:</th> <th><<print setup.ENGINE.statPrint('WSD', $GAMEDATA.PC); >></th> </tr>
<tr> <th><<print setup.ENGINE.karmic_link('PHY')>>:</th> <th><<print setup.ENGINE.statPrint('PHY', $GAMEDATA.PC); >></th> </tr>
<tr> <th><<print setup.ENGINE.karmic_link('STR')>>:</th> <th><<print setup.ENGINE.statPrint('STR', $GAMEDATA.PC); >></th> </tr>
<tr> <th><<print setup.ENGINE.karmic_link('INS')>>:</th> <th><<print setup.ENGINE.statPrint('INS', $GAMEDATA.PC); >></th> </tr>
<tr class='spacer'><td colspan='2'><hr /></td></tr>
<tr style='font-size: 0.75em'> <td>lv [cal]:</td> <td><<print ($GAMEDATA.PC.STATS.level).toFixed(0)+" ["+($GAMEDATA.PC.STATS.caliber).toFixed(0)+"]">></td> </tr>
<tr class='spacer'><td colspan='2'><hr /></td></tr>
<tr> <td>age:</td> <td><<print setup.ENGINE.char_metric('age')>></td> </tr>
<tr> <td><<print setup.ENGINE.karmic_link('height')>>:</td> <td><<print setup.ENGINE.char_metric('ht')>></td> </tr>
<tr> <td><<print setup.ENGINE.karmic_link('weight')>>:</td> <td><<print setup.ENGINE.char_metric('wt')>></td> </tr>
<tr> <td>BMI:</td> <td><<print setup.ENGINE.char_metric('BMI')>></td> </tr>
<tr> <td>Bodyfat:</td> <td><<print setup.ENGINE.char_metric('bodyfat')>></td> </tr>
<tr> <td>Muscle:</td> <td><<print setup.ENGINE.char_metric('bodytone')>></td> </tr>
<tr class='spacer'><td colspan='2'><hr /></td></tr>
<tr> <td>bicep:</td> <td><<print setup.ENGINE.char_metric('bicep')>></td> </tr>
<tr> <td>quads:</td> <td><<print setup.ENGINE.char_metric('quads')>></td> </tr>
<tr class='spacer'><td colspan='2'><hr /></td></tr>
<tr> <td>chest:</td> <td><<print setup.ENGINE.char_metric('chest')>></td> </tr>
<tr> <td><<print setup.ENGINE.karmic_link('cup')>>:</td> <td><<print setup.ENGINE.char_metric('cup')>></td> </tr>
<tr> <td>waist:</td> <td><<print setup.ENGINE.char_metric('waist')>></td> </tr>
<tr> <td>hips:</td> <td><<print setup.ENGINE.char_metric('hips')>></td> </tr>
</table>
<p></p>
<div>
<h4>CONDITION:</h4>
<<print setup.ENGINE.listConditions(); >>
</div>
</div><<print setup.ENGINE.setupPassage();>><<print setup.ENGINE.beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENGINE.replacePassage();>><<else>>
<<run setup.ENGINE.doRest('rest', 20/60); >>
<<run setup.ENGINE.giveFeedback("You rest for a few minutes to recover your strength.");>>
<</if>>
<<print setup.ENGINE.afterPassage();>>
<<if settings.debugInfo>><p>[encounter: _encounter ]</p><</if>>
<p></p>
<<print setup.ENGINE.exitPassage();>> <<if (_hrs) && (_lv)>>
<<print setup.ENGINE.setupPassage();>><<print setup.ENGINE.beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENGINE.replacePassage();>><<else>>
<<run setup.ENGINE.doWorkout('walk', _hrs, _lv); >>
<<replace '#datetime'>><<include 'DATETIME'>><</replace>>
<p><<print setup.ENGINE.descMissing('WALK DISTANCE');>></p>
<p></p>
<</if>>
<<print setup.ENGINE.afterPassage();>>
<<if settings.debugInfo>><p>[encounter: _encounter ]</p><</if>>
<p></p>
<<print setup.ENGINE.exitPassage();>>
<<else>>
<<print setup.ENGINE.workoutTable('walk'); >>
<p class='keypress' key='[SPACE]'>[[RETURN->GO HOME]]</p>
<</if>> <<if (_hrs) && (_lv)>>
<<print setup.ENGINE.setupPassage();>><<print setup.ENGINE.beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENGINE.replacePassage();>><<else>>
<<run setup.ENGINE.doWorkout('jog', _hrs, _lv); >>
<<replace '#datetime'>><<include 'DATETIME'>><</replace>>
<p><<print setup.ENGINE.descMissing('WALK DISTANCE');>></p>
<p></p>
<</if>>
<<print setup.ENGINE.afterPassage();>>
<<if settings.debugInfo>><p>[encounter: _encounter ]</p><</if>>
<p></p>
<<print setup.ENGINE.exitPassage();>>
<<else>>
<<print setup.ENGINE.workoutTable('jog'); >>
<p class='keypress' key='[SPACE]'>[[RETURN->GO HOME]]</p>
<</if>> <<if (_hrs) && (_lv)>>
<<print setup.ENGINE.setupPassage();>><<print setup.ENGINE.beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENGINE.replacePassage();>><<else>>
<<run setup.ENGINE.doWorkout('calisthenics', _hrs, _lv); >>
<<replace '#datetime'>><<include 'DATETIME'>><</replace>>
<p><<print setup.ENGINE.descMissing('CALISTHENIC WORKOUT');>></p>
<p></p>
<</if>>
<<print setup.ENGINE.afterPassage();>>
<<if settings.debugInfo>><p>[encounter: _encounter ]</p><</if>>
<p></p>
<<print setup.ENGINE.exitPassage();>>
<<else>>
<<print setup.ENGINE.workoutTable('calisthenics'); >>
<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 $GAMEDATA = { /* PLAYER DATA */
'PC': {
},
/* gamedata-state moved into PC/CHARS, a new WORLD branch to store global state will be implemented in future */
'CHARS':{
/* reserved for future expansion, character swapping */
},
}>>
<<set setup.TEMP = {};>>
<<include 'setup.ENGINE'>>
<<include 'setup.FLAGS'>>
<<include 'setup.MENU'>>
<<include 'setup.BODY'>>
<<include 'setup.STATUSES'>>
<<include 'setup.ACTIONS'>>
<<include 'setup.WORKOUTS'>>
<<include 'setup.CHARS'>>
<<include 'setup.ROLES'>>
<<include 'setup.AISLES'>>
<<include 'setup.ITEMS'>>
<<include 'setup.ENCOUNTERS'>>
<<include 'setup.PASSAGES'>>
<<include 'setup.DESC'>>
<<include 'setup.NAMES'>>
<<include 'setup.BUILD'>>
<<include 'setup.SITE'>>
<<include 'setup.MODS'>>
<</nobr>><<print setup.ENGINE.setupPassage();>><<print setup.ENGINE.beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENGINE.replacePassage();>><<else>>
<<set _dept = "D06">><<include 'LIST AISLES FOR DEPT'>>
<</if>>
<<print setup.ENGINE.afterPassage();>>
<<if settings.debugInfo>><p>[encounter: _encounter ]</p><</if>>
<p></p>
<<print setup.ENGINE.exitPassage();>><<print setup.ENGINE.setupPassage();>><<print setup.ENGINE.beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENGINE.replacePassage();>><<else>>
<<set _dept = "D10">><<include 'LIST AISLES FOR DEPT'>>
<</if>>
<<print setup.ENGINE.afterPassage();>>
<<if settings.debugInfo>><p>[encounter: _encounter ]</p><</if>>
<p></p>
<<print setup.ENGINE.exitPassage();>><<print setup.ENGINE.setupPassage();>><<print setup.ENGINE.beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENGINE.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.ENGINE.afterPassage();>>
<<if settings.debugInfo>><p>[encounter: _encounter ]</p><</if>>
<p></p>
<<print setup.ENGINE.exitPassage();>><<print setup.ENGINE.setupPassage();>><<print setup.ENGINE.beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENGINE.replacePassage();>><<else>>
<<if $GAMEDATA.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.ENGINE.depleteItem('D08_A09_I03');
$GAMEDATA.PC.MATRIX.regen += 10;
setup.ENGINE.do_status_update();
>>
<</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.ENGINE.menuShow('self'); >><</link>></p>
<</if>>
<<print setup.ENGINE.afterPassage();>>
<<if settings.debugInfo>><p>[encounter: _encounter ]</p><</if>>
<p></p>
<<print setup.ENGINE.exitPassage();>>Double-click this passage to edit it.<div class='left framed'>
<p>ACTIONS</p>
<p>What will you do today?</p>
<p></p>
<<include "ACTIONS MOTEL ROOM">>
<p></p>
<<print setup.ENGINE.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.ENGINE.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.ITEMS>>
<<if _aisle == _item_id.substr(0,7)>>
<<print setup.ENGINE.itemCard(_item_id);>>
<</if>>
<</for>>
<hr/><<print setup.ENGINE.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 $GAMEDATA.PC.STUFF>>
<<if !(("consumable"==setup.ROLES.ALL[setup.ITEMS[_item_id].role].type)||("wearable"==setup.ROLES.ALL[setup.ITEMS[_item_id].role].type)) >>
<li><<print
setup.ITEMS[_item_id].name +" ("+ _uses + " uses remaining)"
>></li>
<</if>>
<</for>>
</ul>
<hr/>
<ul class='items junk'>
<<for _jid, _jname range $GAMEDATA.PC.JUNK>>
<li><<print _jname >></li>
<</for>>
</ul>
<p></p>
<p></p>
<p class='keypress' key='[ESC]'><<link 'RETURN'>><<run setup.ENGINE.menuHide();>><</link>></p><div class='framed'>
<h3>Attire</h3>
<ul class='items'>
<<for _slot, _item_id range $GAMEDATA.PC.EQUIP>>
<<if _item_id>>
<li><<print "
<<link '"+ _slot +": "+ setup.ITEMS[_item_id].name +"'>>
<<if setup.ENGINE.removeItem( '" + _item_id + "' )>>
<<else>>
<</if>>
<<run setup.ENGINE.menuShow('equip');>>
<</link>>
">></li>
<</if>>
<</for>>
</ul>
</div>
<hr/>
<hr/>
<div class='framed'>
<h3>Wardrobe</h3>
<ul class='items'>
<<for _item_id, _uses range $GAMEDATA.PC.STUFF>>
<<if "wearable"==setup.ROLES.ALL[setup.ITEMS[_item_id].role].type >>
<li><<print "
<<link '"+ setup.ITEMS[_item_id].name +" ("+ _uses + " uses remaining)'>>
<<if setup.ENGINE.useItem( '" + _item_id + "' )>>
<<else>>
<</if>>
<<run setup.ENGINE.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.ENGINE.menuHide();
>>
<</link>></p>
<br /><br /><br /><br /><br />
<<set _open = 0; _pack = 0; if(!_SOURCE_CHAR) { _SOURCE_CHAR=$GAMEDATA.PC; } if(!_TARGET_CHAR) { _TARGET_CHAR=$GAMEDATA.PC; } >>
<<for _item_id, _uses range _SOURCE_CHAR.STUFF>>
<<if "consumable"==setup.ROLES.ALL[setup.ITEMS[_item_id].role].type >>
<<print setup.ENGINE.wrap(
setup.ENGINE.foodCard(_item_id),
'div', ('item'+(settings.lod_energyMatrix ? '-matrix' : '')+' glass'), {
'id':_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.ENGINE.menuHide();
>>
<</link>></p><<if ($GAMEDATA.PC.STATE)>><<print setup.ENGINE.getTime(); >> <<print setup.ENGINE.getLongDate(); >><</if>><hr/><hr/>
<ul class='side-menu'>
<li class='keypress' key='[F5]'><<link "Stats & Metrics">><<replace "#detail">><<set $GAMEDATA.PC.STATE.detail="STATS"; >><<include "STATS" >><</replace>><</link>></li>
<li class='keypress' key='[F6]'><<link "Resources" >><<replace "#detail">><<set $GAMEDATA.PC.STATE.detail="RESOURCES"; >><<include "RESOURCES" >><</replace>><</link>></li>
<li class='keypress' key='[F7]'><<link "Energy Levels" >><<replace "#detail">><<set $GAMEDATA.PC.STATE.detail="ENERGY"; >><<include "ENERGY" >><</replace>><</link>></li>
<hr/>
<<print setup.ENGINE.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.ENGINE.gameVersion()>> by<br/>
<a target="_blank" href='http://patreon.com/ShadowRx'>ShadowRx</a><br/>
<<set _build=setup.ENGINE.buildVersion>>
<<set _mods=setup.ENGINE.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.ENGINE.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.ENGINE.setTime(1,1)>>
<p>Its 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.ENGINE.karmaAdd(-_cost, $GAMEDATA.PC);
$GAMEDATA.PC[_type][_stat] += _amt;
setup.ENGINE.do_status_update();
if('GO HOME'==State.passage) { Engine.play(State.passage, true); }
setup.ENGINE.menuHide();
>>
<</link>>
</span> / <span class='keypress' key='[ESC]'><<link 'NO'>><<run setup.ENGINE.menuHide();>><</link>></span>
</b>
</div><p class='wide'>If only you had a proper mirror to use...</p>
<p class='wide'>You are <<desc "height">>, roughly <<val "height">>, and <<desc "weight">>, somewhere around <<val "weight">> when last you checked. You're <<desc "bodytone">>, with <<val "bodyfat">> body-fat.</p>
<p class='wide'>You have a <<desc "bust">> size <<val "cup">> chest with a wingspan of <<val "chest">>, which tapers to a <<desc "waist">> <<val "waist">> waist with <<desc "abs">> and curves out to <<desc "hips">> <<val "hips">> hips.</p>
<p class='wide'>Your arms are <<desc "arms">>, with <<desc "bicep">> biceps about <<val "bicep">>. Your legs <<desc "legs">>, measuring <<val "quads">> across your <<desc "quads">> quads and <<val "calf">> calves.</p>
<p class='wide'>Overall you are <<desc "health">> and <<desc "fitness">>.</p>
<<linkappend 'CHECK MUSCLETONE'>><<print setup.ENGINE.listMuscleStatus();>><</linkappend>>
<p></p>
<p></p>
<p></p>
<p class='keypress' key='[ESC]'><<link 'RETURN'>><<run setup.ENGINE.menuHide();>><</link>></p><<set setup.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':{} },
/* END setup.ITEMS */ }>><<set setup.ENGINE={ /* GAME ENGINE -- everything below this point */
'engineVersion' : 0.25283,
'contentVersion' : 0.32162,
'gameVersion' : function(style) {
var out = '';
switch(style) {
case 'full':
out = 'engine v. '+setup.ENGINE.engineVersion+' | content v. '+setup.ENGINE.contentVersion;
break;
default:
out = ((setup.ENGINE.engineVersion+setup.ENGINE.contentVersion)/2).toFixed(5);
break;
}
return out;
},
'buildVersion' : "public",
'contentSite' : "?",
'modVersion' : "?",
'versionUpdate' : function() {
/* v0.1-0.11 */
var out_of_date=false;
if(!$GAMEDATA.WORLD) { $GAMEDATA.WORLD={}; }
var PC = $GAMEDATA.PC;
var WORLD = $GAMEDATA.WORLD;
/* shift gamestate data to characters before running additional tests */
if(!PC.STATE && $GAMEDATA.STATE) { PC.STATE = $GAMEDATA.STATE; $GAMEDATA.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<setup.ENGINE.engineVersion ){
if(PC.STATE.saveVersion<0.21) {
/* do updates accordingly, default character is Cindy */
if((typeof PC.METRICS.bust=='undefined')) { out_of_date=true; PC.METRICS.bust = 2; }
if(!PC.PASSAGES) { out_of_date=true; PC.PASSAGES={ 'start':"START CINDY", 'home':"LIVING IN CAR" }; }
if(!PC.STATE) { out_of_date=true; PC.STATE={ 'Date': new Date() }; }
if(!PC.STATE.lastPassage) { out_of_date=true; PC.STATE.lastPassage = State.passage; }
if(!PC.METRICS.base_ht) { out_of_date=true; PC.METRICS.base_ht=setup.CHARS['Cindy Phoenix'].METRICS.base_ht; }
if(!PC.METRICS.adj_wt) { out_of_date=true; PC.METRICS.adj_wt=setup.CHARS['Cindy Phoenix'].METRICS.wt; }
if(!PC.JUNK) { out_of_date=true; PC.JUNK={}; }
}
if(PC.STATE.saveVersion<0.3) {
/* do updates accordingly */
if(!PC.STATS.INS) { out_of_date=true; PC.STATS.INS = PC.STATS.level; }
if(!PC.STATS.WSD) { out_of_date=true; PC.STATS.WSD = PC.STATS.level; }
if(!PC.MATRIX.skill) { out_of_date=true; PC.MATRIX.skill = setup.ENGINE.pow(PC.STATS.level, 2, '-'); }
if(!PC.MATRIX.train) { out_of_date=true; PC.MATRIX.train = setup.ENGINE.pow(PC.STATS.level, 2, '-'); }
if(!PC.MATRIX.force) { out_of_date=true; PC.MATRIX.force = setup.ENGINE.pow(PC.STATS.level, 2, '-'); }
if(!PC.MATRIX.guard) { out_of_date=true; PC.MATRIX.guard = setup.ENGINE.pow(PC.STATS.level, 2, '-'); }
if(!PC.MATRIX.fight) { out_of_date=true; PC.MATRIX.fight = setup.ENGINE.pow(PC.STATS.level, 2, '-'); }
if(!PC.MATRIX.react) { out_of_date=true; PC.MATRIX.react = setup.ENGINE.pow(PC.STATS.level, 2, '-'); }
if(!PC.MATRIX.focus) { out_of_date=true; PC.MATRIX.focus = setup.ENGINE.pow(PC.STATS.level, 2, '-'); }
if(!PC.MATRIX.aware) { out_of_date=true; PC.MATRIX.aware = setup.ENGINE.pow(PC.STATS.level, 2, '-'); }
if(!PC.MATRIX.psych) { out_of_date=true; PC.MATRIX.psych = setup.ENGINE.pow(PC.STATS.level, 2, '-'); }
if(!PC.TRAITS.gender) { out_of_date=true; PC.TRAITS.gender = 'female'; }
if(!PC.TRAITS.species) { out_of_date=true; PC.TRAITS.species = 'huma'; }
if(!PC.NAMES.full) { out_of_date=true; PC.NAMES.full = setup.ENGINE.getName(['online','birth','first']); }
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 $GAMEDATA.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=setup.ENGINE.new_BODY(1,1); }
if(!PC.LIMBS) { out_of_date=true; PC.LIMBS={}; setup.ENGINE.regenerateBody(0.0001, 0.0001, PC); }
if(!$GAMEDATA.ERRORS) { $GAMEDATA.ERRORS={ 'NaN':{}, }; }
if(!PC.IS) { out_of_date=true; PC.IS={}; /* INCOME STATEMENT */ }
if(!PC.BS) { out_of_date=true; PC.BS={}; /* BALANCE SHEET */ }
if(!PC.ES) { out_of_date=true; PC.ES={}; /* EVENT SCHEDULE */ }
if(!PC.EQ) { out_of_date=true; PC.EQ={}; /* ENCOUNTER QUEUE */ }
if(!PC.X) { out_of_date=true; PC.X={}; /* X */ }
if(!PC.A) { out_of_date=true; PC.A={}; /* A */ }
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=$GAMEDATA.WORLD.girlPower/10; }
if(!WORLD.NPCS) { out_of_date=true; WORLD.NPCS={}; }
/* new, compound metrics system */
if(!PC.M) { out_of_date=true; PC.M={}; }
/* new, compound weight system - WiP, do not enable */
if(!PC.M.wt && false) {
out_of_date=true;
PC.M.wt={
'BODY':{
'muscle' : 0,
'bone' : 0,
'organs' : 0,
'fat' : 0,
},
'CACHED':{
'body' : 0,
'gear' : 0,
'holding' : 0,
'total' : 0,
},
};
}
/* new, compound stats system */
if(!PC.S) { out_of_date=true; PC.S={}; }
}
/* 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(!out_of_date) { PC.STATE.saveVersion = setup.ENGINE.engineVersion; }
}
},
'a_an' : function(test) {
var first_letter = test.charAt(0).toLowerCase();
var next_word=test.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'; break;
/* base rule */
default: return 'an'; break;
} break;
/* starts with consonant */
default:
switch(next_word) {
/* exceptions */
case 'hour':
return 'an'; break;
/* base rule */
default: return 'a'; break;
} break;
}
},
'abFlicker' : function(msg_a, msg_b, rate, freq) {
var aware = (($GAMEDATA && $GAMEDATA.PC && $GAMEDATA.PC.MATRIX && $GAMEDATA.PC.MATRIX.aware) ? $GAMEDATA.PC.MATRIX.aware : 1.0);
rate=(rate||setup.ENGINE.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>";
},
'addDays' : function(d, dateObj) { dateObj=dateObj||$GAMEDATA.PC.STATE.Date; try { dateObj.setDate(dateObj.getDate()+d); } catch (e) {} finally { setup.ENGINE.fixDate(dateObj); } },
'addHours' : function(h, dateObj) { dateObj=dateObj||$GAMEDATA.PC.STATE.Date; try { dateObj.setHours(dateObj.getHours()+h); } catch (e) {} finally { setup.ENGINE.fixDate(dateObj); } },
'addItem' : function(item_id, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
/* 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]+=setup.ENGINE.getItem(item_id).uses;
return true;
},
'addMinutes' : function(n, dateObj) { dateObj=dateObj||$GAMEDATA.PC.STATE.Date; try { dateObj.setMinutes(dateObj.getMinutes()+n); } catch (e) {} finally { setup.ENGINE.fixDate(dateObj); } },
'addMonths' : function(m, dateObj) { dateObj=dateObj||$GAMEDATA.PC.STATE.Date; try { dateObj.setMonth(dateObj.getMonth()+m); } catch (e) {} finally { setup.ENGINE.fixDate(dateObj); } },
'addSeconds' : function(s, dateObj) { dateObj=dateObj||$GAMEDATA.PC.STATE.Date; try { dateObj.setSeconds(dateObj.getSeconds()+s); } catch (e) {} finally { setup.ENGINE.fixDate(dateObj); } },
'addWeeks' : function(w, dateObj) { dateObj=dateObj||$GAMEDATA.PC.STATE.Date; try { setup.ENGINE.addDays(w*7, dateObj); } catch (e) {} finally { setup.ENGINE.fixDate(dateObj); } },
'addYears' : function(y, dateObj) { dateObj=dateObj||$GAMEDATA.PC.STATE.Date; try { dateObj.setYear(dateObj.getYear()+y); } catch (e) {} finally { setup.ENGINE.fixDate(dateObj); } },
'after_update' : function(CHAR){
CHAR=CHAR||$GAMEDATA.PC;
if($GAMEDATA.PC.dead) {
$('#passages').wiki("<<goto 'GAME OVER'>>");
}
},
'adjustWeight' : function(hours, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
setup.ENGINE.debugClear();
var bodymass = setup.ENGINE.calcBodyMass(CHAR);
var E = CHAR.MATRIX;
var M = CHAR.METRICS;
var unbalanced = true;
var loops = 0;
/* ADJUST WEIGHT - rebalance, lose, then gain */
while( (M.adj_wt>(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);
setup.ENGINE.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);
setup.ENGINE.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);
setup.ENGINE.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);
setup.ENGINE.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);
setup.ENGINE.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);
setup.ENGINE.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 = setup.ENGINE.calcBodyMass(CHAR);
setup.ENGINE.debugLog(loops + ': lost a pound -- wt: '+ M.wt +'; metabolic-bodymass: '+ bodymass.toFixed(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 = setup.ENGINE.calcBodyMass(CHAR);
setup.ENGINE.debugLog(loops + ': gained a pound -- wt: '+ M.wt +'; metabolic-bodymass: '+ bodymass.toFixed(1) +'; kCal: '+ E.kcal +'; protein: '+ E.protein +'g; sugar: '+ E.sugar +'g;');
unbalanced = true;
}
/* repeat until no rebalances trigger or too many cycles pass */
}
},
'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) {},
'azIScaleStats' : function(gender, STATS, PARAM) {
PARAM=PARAM||{};
var NEW_STATS = Object.assign({}, STATS);
var BASE = PARAM['BASE']||{ 'STR':0, 'END':0, 'SPD':0, 'PHY':0, 'INS':0, 'WSD':0 };
var amazonIndex = PARAM['amazonIndex'] || $GAMEDATA.WORLD.amazonIndex;
var azI_root = setup.ENGINE.sqrt(amazonIndex, '+');
var azI_avg = (amazonIndex+azI_root)/2;
switch(true) {
case (gender=='female'): case (gender=='futa'):
NEW_STATS.STR = BASE.STR+(STATS.STR*amazonIndex);
NEW_STATS.END = BASE.END+(STATS.END*azI_avg);
NEW_STATS.SPD = BASE.SPD+(STATS.SPD*azI_avg);
NEW_STATS.PHY = BASE.PHY+(STATS.PHY*azI_avg);
NEW_STATS.INS = BASE.INS+(STATS.INS*azI_root);
NEW_STATS.WSD = BASE.WSD+(STATS.WSD*azI_root);
break;
case (gender=='male'): case (gender=='none'): default: break;
}
return NEW_STATS;
},
'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) {
CHAR=CHAR||$GAMEDATA.PC;
if(CHAR.X.timeShards) { CHAR.X.timeShards++; } else { CHAR.X.timeShards=1; }
if(CHAR.A.broke_time) { CHAR.A.broke_time++; } else { CHAR.A.broke_time=1; }
},
'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'],
'buyItem' : function(item_id, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
$GAMEDATA.PC.STATE.lastAction = 'buy';
var ITEM = setup.ENGINE.getItem(item_id);
var success=null;
if(parseFloat(CHAR.MATRIX.money.toFixed(2))<ITEM.cost) {
setup.ENGINE.giveFeedback('you don't have enough money to buy this!');
success=false;
} else {
CHAR.MATRIX.money-=setup.ENGINE.sale_price(ITEM.cost, setup.ENGINE.check_sale(item_id));
setup.ENGINE.giveFeedback('You bought [' + ITEM.name + '], which leaves you with $ ' + (CHAR.MATRIX.money).toFixed(2));
success=true;
}
if(success) { setup.ENGINE.addItem(item_id); }
setup.ENGINE.do_status_update(CHAR);
return success;
},
'calcBodyMass' : function(CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
var S = CHAR.STATS;
var M = CHAR.METRICS;
var E = CHAR.MATRIX;
/* 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.caliber*3, (setup.ENGINE.sqrt( (E.vigor*S.caliber)-(E.metab/S.caliber),'-' )) );
var scaled_mass = Math.min(M.adj_wt*3, ((M.adj_wt/(S.PHY/10))-creatine_reserve) );
var min_mass = ((M.wt/(S.PHY/10)) + S.level)/S.caliber;
/* setup.ENGINE.WTF({
'creatine_reserve' : creatine_reserve,
'scaled_mass' : scaled_mass,
'min_mass' : min_mass,
'adj_wt' : M.adj_wt,
'base wt' : M.wt,
}, true); */
return Math.max( min_mass, scaled_mass);
},
'calcBust' : function(bust, raw) {
var uk_cup = '';
switch(true) {
case (bust<0): uk_cup = 'AA'; break;
case (bust>38): uk_cup = 'OMG'; break;
default: uk_cup = setup.ENGINE.bust_UK[bust]; break;
}
if(raw) {
return "<span title='They appear to be ""+ uk_cup +" cup" ("+ setup.ENGINE.formatLength(bust) +"), relative to your frame/size, they are actually "+ setup.ENGINE.formatLength(raw) +" across.'>"+ uk_cup +"</span>";
} else {
return uk_cup;
}
},
'calcKarmicWell' : function(STATS) {
return (
setup.ENGINE.stack(STATS.STR)
+ setup.ENGINE.stack(STATS.END)
+ setup.ENGINE.stack(STATS.SPD)
+ setup.ENGINE.stack(STATS.PHY)
+ setup.ENGINE.stack(STATS.INS)
+ setup.ENGINE.stack(STATS.WSD)
);
},
'calcMetric' : function(metric, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
if(!CHAR.BODY) {
CHAR.BODY=setup.ENGINE.new_BODY(1, CHAR.STATS.caliber);
setup.ENGINE.regenerateBody(0.0001, CHAR);
}
var M=CHAR.METRICS; var S=CHAR.STATS; var T=CHAR.TRAITS; var B=CHAR.BODY;
var min=0; var base=0; var stat_mod=0; var gen_mod=0; var wt_mod=0; var tone_mod=0; var tone_mod_L=0; var tone_mod_R=0;
var calc=0;
switch(metric) {
case 'left_bicep':
case 'right_bicep':
case 'bicep':
min = 2;
base = 3;
tone_mod_L = (0.69*B.LeftBi.train ) + (0.34*B.LeftTri.train );
tone_mod_R = (0.69*B.RightBi.train) + (0.34*B.RightTri.train);
switch(metric) {
case 'left_bicep': tone_mod = tone_mod_L; break;
case 'right_bicep': tone_mod = tone_mod_R; break;
case 'bicep': tone_mod = (tone_mod_L+tone_mod_R)/2; break;
}
gen_mod = (T.gender=='male' ? 1: 0);
wt_mod = (M.wt /60) +(M.bodyfat/20);
stat_mod = (S.STR/20) +(S.PHY/40) +(S.END/50);
break;
case 'quads':
min = 5;
base = 6;
tone_mod = (1.34*B.Quads.train) + (0.69*B.Hams.train);
gen_mod = (T.gender=='male' ? -2: 0);
wt_mod = (M.wt /42) +(M.bodyfat/10);
stat_mod = (S.STR/10) +(S.PHY/20) +(S.END/40);
break;
case 'chest':
min = 12;
base = 22;
tone_mod = (0.84*B.Lats.train) + (0.69*B.Pecs.train);
gen_mod = (T.gender=='male' ? 4: 0);
wt_mod = (M.wt/100) +(M.bodyfat/25);
stat_mod = (S.STR/15) +(S.PHY/50) +(S.END/75);
break;
case 'waist':
min = 8;
base = 12;
tone_mod = (0.42*B.Abs.train) + (0.16*B.LoBack.train);
gen_mod = (T.gender=='male' ? 5: 0);
wt_mod = ((M.wt-M.ht)/49 ) +((M.bodyfat-10)/3.5);
stat_mod = (S.STR/30) -(S.PHY/20) +(S.END/20);
break;
case 'hips':
min = 10;
base = 18;
tone_mod = (0.84*B.Glutes.train) + (0.34*B.Hips.train);
gen_mod = (T.gender=='male' ? -6: 0);
wt_mod = (M.wt /63) +(M.bodyfat/ 6);
stat_mod = (S.STR/10) +(S.PHY/15) +(S.END/25);
break;
case 'cup':
min = -1;
base = -4+(M.bust);
tone_mod = (0.34*B.Pecs.train);
gen_mod = (T.gender=='male' ? -4: 0);
wt_mod = setup.ENGINE.sqrt( (M.wt /40) +(M.bodyfat/5), '-' );
stat_mod = setup.ENGINE.sqrt( ((S.STR/20) -(S.PHY/50) +(S.END/35)), '-' );
break;
default:
return metric;
break;
}
tone_mod *= setup.ENGINE.unstack(S.caliber)/5;
if(stat_mod>1) { stat_mod = setup.ENGINE.unstack(stat_mod)*2; }
calc=Math.max(min, base+gen_mod+stat_mod+wt_mod+tone_mod);
/* if the data is not available for calculations, change nothing */
if(isNaN(calc)) { return M[metric]; }
if("cup"===metric) {
return (settings.mac_breastExpansion ? calc : setup.ENGINE.unstack(calc));
} else {
return (setup.FLAGS.DISPLAY.base_metrics ? calc : setup.ENGINE.scale(calc, 2, CHAR));
}
},
'calcReps' : function(workout, weight, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
workout=workout||_workout;
weight=weight||_weight;
var hbw = CHAR.METRICS.adj_wt * setup.WORKOUTS[workout].pbw;
var liftpower = (Math.min(CHAR.MATRIX.power-hbw, (CHAR.STATS.STR * CHAR.STATS.SPD)) + ((CHAR.METRICS.adj_wt-CHAR.METRICS.ht)/4)) * setup.WORKOUTS[workout].pls;
var lift_pct = (liftpower/weight);
var reps = (lift_pct>1 ? ((lift_pct-0.97)*30) : lift_pct);
var rand = setup.ENGINE.rand(0.25, 1.75)+0.34;
reps *= rand;
return reps;
},
'canDo' : function(action_type, activity, hours, level, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
action_type=action_type.toUpperCase();
var ACT_MATRIX = setup.ACTIONS[action_type][activity].MATRIX;
hours=hours||setup.ACTIONS[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.STATUS.qi=='unconscious') {
can = false;
break;
}
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;
case 'karma':
if(setup.ENGINE.getTotalKarma(CHAR) < (-ACT_MATRIX[resource] *effort)) {
can = false;
}
break;
default:
if(CHAR.MATRIX[resource] < (-ACT_MATRIX[resource] *effort)) {
can = false;
}
break;
}
}
});
break;
}
if(typeof setup.ACTIONS[action_type][activity].canDo=='function') {
/* passthrough filter, can override */
can = setup.ACTIONS[action_type][activity].canDo(can);
}
return can;
},
'canDoLift' : function(workout, CHAR, autoAbort) {
CHAR=CHAR||$GAMEDATA.PC;
var RESULT = {
'canDo' : true,
'reason' : '',
'REGIONS' : {},
'TYPES' : {},
};
var partCondition = 0;
var pType = '';
var cal = CHAR.STATS.caliber;
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 * cal) - B[part].damage - B[part].fatigue;
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) {
CHAR=CHAR||$GAMEDATA.PC;
return (CHAR.PROPERTY.car
? "[[DRIVE SOMEWHERE]]"
: (CHAR.MATRIX.money>20
? "[[CALL CAB]]"
: "[[WALK SOMEWHERE]]"
)
);
},
'causeOfDeath' : function(CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
return (CHAR.CoD ? CHAR.CoD : 'cause of death unknown');
},
'char_metric' : function(metric, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
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 = setup.ENGINE.formatLength(CHAR.METRICS[metric]);
} else {
value = setup.ENGINE.formatHeight(CHAR.METRICS[metric]);
}
break;
case 'weight':
metric = 'wt';
case 'wt':
if(!setup.FLAGS.DISPLAY.base_metrics) {
value = setup.ENGINE.formatWeight(CHAR.METRICS['adj_wt']);
} else {
value = setup.ENGINE.formatWeight(CHAR.METRICS[metric]);
}
break;
case 'bust':
value = setup.ENGINE.formatLength(CHAR.METRICS[metric])
+((('male'==CHAR.TRAITS.gender)||('none'==CHAR.TRAITS.gender)) ? '' : " "+ setup.ENGINE.calcBust(CHAR.METRICS['cup'], setup.ENGINE.scale(CHAR.METRICS[metric], 2, CHAR)));
break;
/* simple measures */
case 'bicep' :
case 'quads' :
case 'chest' :
case 'waist' :
case 'hips' :
value = setup.ENGINE.formatLength(CHAR.METRICS[metric]);
break;
case 'measurements':
case 'figure':
value =
setup.ENGINE.formatLength(CHAR.METRICS['chest'])
+((('male'==CHAR.TRAITS.gender)||('none'==CHAR.TRAITS.gender)) ? '' : " "+ setup.ENGINE.calcBust(CHAR.METRICS['cup'], setup.ENGINE.scale(CHAR.METRICS[metric], 2, CHAR)))
+' - '+setup.ENGINE.formatLength(CHAR.METRICS['waist'])
+' - '+setup.ENGINE.formatLength(CHAR.METRICS['hips']);
break;
case 'bodyfat' :
case 'bodytone' :
value = CHAR.METRICS[metric].toFixed(1) +'%';
break;
case 'BMI' :
value = CHAR.METRICS[metric].toFixed(1);
break;
/* no change, if requested show cup regardless of gender */
case 'cup' :
value = setup.ENGINE.calcBust(CHAR.METRICS[metric], setup.ENGINE.scale(CHAR.METRICS[metric], 2, CHAR));
break;
case 'age' :
value = CHAR.METRICS[metric];
break;
default:
value = null;
break;
}
if(isNaN(value)) { try { $GAMEDATA.ERRORS.NaN['char-'+metric]= ($GAMEDATA.ERRORS.NaN['char-'+metric]+1)||1; } catch(e) {} }
return value;
},
'char_select_menu' : function() {
var select_screen = '';
select_screen += "<div><<link 'Cindy (aspiring actress)'>><<run setup.ENGINE.select_char('Cindy Phoenix'); >><<goto $GAMEDATA.PC.PASSAGES.start >><</link>></div>";
select_screen += "<div><<link 'Tammi (unemployed waitress)'>><<run setup.ENGINE.select_char('Tammi X'); >><<goto $GAMEDATA.PC.PASSAGES.start >><</link>></div>";
return select_screen;
},
'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;
}
},
'check_sale' : function(item_id) {
return 0.0;
},
'combatAction' : function(ATT, DEF, action) {
var RESULT={
'cnt_msg':'',
'hit_msg':'',
'cnd_msg':'',
'act_group':'main',
'act_name':action,
'act_mode':(action=='auto' ? 'auto' : 'manual'),
};
if(!ATT.stun) {
switch(action) {
case 'punch': RESULT=setup.ENGINE.combatStrike(ATT, DEF, action); break;
case 'kick': RESULT=setup.ENGINE.combatStrike(ATT, DEF, action); break;
case 'slap': RESULT=setup.ENGINE.combatStrike(ATT, DEF, action); break;
case 'headbutt': RESULT=setup.ENGINE.combatStrike(ATT, DEF, action); break;
case 'auto':
/* rest if needed, or just to be odd... */
if((Math.random()<0.05)||(ATT.MATRIX.vigor<1 && Math.random()<0.50)) {
RESULT=setup.ENGINE.combatGuard(ATT, DEF, action);
} else {
RESULT=setup.ENGINE.combatStrike(ATT, DEF, action);
}
break;
case 'rest': RESULT=setup.ENGINE.combatRest(ATT, DEF, action); break;
case 'guard': RESULT=setup.ENGINE.combatGuard(ATT, DEF, action); break;
default: RESULT['error']='unrecognized action: "'+ action +'"'; break;
}
} else {
RESULT['cnd_msg']=ATT.name_first +' isn't able to fight back.';
/* regen+flow, or decay */
setup.ENGINE.qiFlow(0.034, 1, ATT); setup.ENGINE.do_status_update(ATT);
setup.ENGINE.qiFlow(0.034, 1, DEF); setup.ENGINE.do_status_update(DEF);
}
return RESULT;
},
'combatDrain' : function(ATT, DEF, action) {
var drain_pct = 0.16*setup.ENGINE.rand(0.06, 0.34);
var drain_qi = drain_pct*DEF.STATS.max_qi;
setup.ENGINE.powerTransfer(DEF, ATT, drain_pct, {'xfer_height':true});
setup.ENGINE.qiAdd(-drain_qi, DEF);
setup.ENGINE.qiAdd(drain_qi, ATT);
setup.ENGINE.darkAdd(drain_qi, ATT);
setup.ENGINE.lightAdd(drain_qi, DEF);
DEF.drained=true;
setup.ENGINE.qiFlow(0.1, 1, DEF); setup.ENGINE.do_status_update(DEF);
setup.ENGINE.qiFlow(0.1, 1, ATT); setup.ENGINE.do_status_update(ATT);
setup.ENGINE.refresh_fighter_info(ATT);
setup.ENGINE.refresh_fighter_info(DEF);
return drain_pct;
},
'combatGuard' : function(ATT, DEF, action) {
var RESULT={
'cnt_msg':'',
'hit_msg':'',
'cnd_msg':'',
'act_group':'guard',
'act_name':action,
'act_mode':(action=='auto' ? 'auto' : 'manual'),
};
RESULT['hit_msg']= ATT.name_first +' takes a moment to catch '+ setup.ENGINE.his_her(ATT.gender) +' breath while '+ setup.ENGINE.he_she(ATT.gender||ATT.TRAITS.gender) +' waits for an opening...';
/* 3 sec active recovery */
setup.ENGINE.recoverActive(3/3600, ATT);
setup.ENGINE.qiFlow(0.134, 1, ATT); setup.ENGINE.do_status_update(ATT);
setup.ENGINE.qiFlow(0.069, 1, DEF); setup.ENGINE.do_status_update(DEF);
RESULT['cnd_msg']= ATT.name_first +' '+ setup.ENGINE.fighterCondition(ATT);
ATT.guarding=true;
return RESULT;
},
'combatHeal' : function(ATT, DEF, action) {
var focus_used = (Math.max(100, ATT.MATRIX.focus*0.34) * 0.69*setup.ENGINE.rand(0.16, 3.46));
var heal_amt = (focus_used*setup.ENGINE.rand(1.34, 6.42));
ATT.MATRIX.focus -= focus_used;
setup.ENGINE.charTempVar(DEF, 'newQi', DEF.MATRIX.qi+heal_amt);
setup.ENGINE.qiAdd(heal_amt, DEF);
setup.ENGINE.qiAdd(-(heal_amt/3), ATT);
setup.ENGINE.lightAdd((focus_used)/3, ATT);
setup.ENGINE.qiFlow(0.1, 1, DEF); setup.ENGINE.do_status_update(DEF);
setup.ENGINE.qiFlow(0.1, 1, ATT); setup.ENGINE.do_status_update(ATT);
},
'combatRefresh' : function() {
return "
<<run setup.ENGINE.refresh_fighter_info(_P1); setup.ENGINE.fighterCondition(_P1); >>
<<run setup.ENGINE.refresh_fighter_info(_P2); setup.ENGINE.fighterCondition(_P2); >>
<<replace '#combat_p1'>><<include 'COMBAT P1'>><</replace>>
<<replace '#combat_p2'>><<include 'COMBAT P2'>><</replace>>
<<replace '#combat_act'>><<include 'ACTIONS COMBAT'>><</replace>>
";
},
'combatRest' : function(ATT, DEF, action) {
var RESULT={
'cnt_msg':'',
'hit_msg':'',
'cnd_msg':'',
'act_group':'rest',
'act_name':action,
'act_mode':(action=='auto' ? 'auto' : 'manual'),
};
RESULT['hit_msg']= ATT.name_first +' takes a moment to catch '+ setup.ENGINE.his_her(ATT.gender) +' breath.';
/* 1 sec active recovery */
setup.ENGINE.recoverActive(1/3600, ATT);
setup.ENGINE.qiFlow(0.134, 1, ATT); setup.ENGINE.do_status_update(ATT);
setup.ENGINE.qiFlow(0.069, 1, DEF); setup.ENGINE.do_status_update(DEF);
RESULT['cnd_msg']= ATT.name_first +' '+ setup.ENGINE.fighterCondition(ATT);
return RESULT;
},
'combatRevive' : function(ATT, DEF, action) {
DEF.stun = false; DEF.dead = false; DEF.CoD=null; delete DEF.CoD;
DEF.MATRIX.qi = Math.abs(DEF.MATRIX.qi*1.5);
setup.ENGINE.do_status_update(DEF);
setup.ENGINE.do_status_update(ATT);
},
'combatStrike' : function(ATT, DEF, action, counter) {
var RESULT={
'cnt_msg':'',
'hit_msg':'',
'cnd_msg':'',
'act_group':'strike',
'act_name':action,
'act_mode':(action=='auto' ? 'auto' : 'manual'),
};
var aS = ATT.STATS; var aE = ATT.MATRIX; var aCal = aS.caliber; var aLv = aS.level; var aMin = aLv*aCal; var aName = ATT.name_first;
var dS = DEF.STATS; var dE = DEF.MATRIX; var dCal = dS.caliber; 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 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'==setup.ENGINE.he_she(ATT.gender);
var dG = 'she'==setup.ENGINE.he_she(DEF.gender);
var gMul = setup.ENGINE.rand(0.1, 1.0);
var gMulAtt = gMul * ( aG ? aS.caliber : 3.0 );
var gMulDef = gMul * ( dG ? dS.caliber : 3.0 );
var aI = ( aG ? (setup.ENGINE.sqrt(aCal, '-')) : 1 );
var dI = ( dG ? (setup.ENGINE.sqrt(dCal, '-')) : 1 );
var defGuard = (DEF.guarding ? setup.ENGINE.sqrt(dCal, '-') : 1 ); DEF.guarding=false; ATT.guarding=false;
var attExhaust = Math.min(0, aE.vigor);
var attRoll = ( Math.max(1.0, setup.ENGINE.rand(0.3*aI, 6+aCal)) * Math.max(aE.fight+attExhaust, aMin) );
var defRoll = ( Math.max(1.0, setup.ENGINE.rand(0.3*dI, 1+dCal)) * Math.max(dE.react, dMin)*defGuard );
var attCrit = ( Math.max(1.0, setup.ENGINE.rand(0.3*aI, 1.5*aI)) * Math.max(aE.skill+attExhaust, aMin) );
var defCrit = ( Math.max(1.0, setup.ENGINE.rand(0.3*dI, 1.5*dI)) * Math.max(dE.guard, dMin)*defGuard );
var atkPow = ( Math.max(1.0, setup.ENGINE.rand(0.3*aI, 1.5*aI)) * Math.max(aE.power+attExhaust, aMin) );
var defPow = ( Math.max(1.0, setup.ENGINE.rand(0.3*dI, 1.5*dI)) * Math.max(dE.tough, dMin)*defGuard );
var dmg = Math.ceil(Math.abs(Math.max(1, (atkPow -(defPow*defCoreCond))/6 )));
var tuf = Math.ceil(Math.abs(Math.max(1, atkPow/(34*defCoreCond) )));
var cap = null;
var dK = 0; /* scale down only */
var adRatio = Math.min(1.0, aLv/dLv);
/* Counter */
if(counter) {
switch(action) {
case 'punch': aStam = 1.0; break;
case 'kick': aStam = 3.0; break;
case 'slap': aStam = 0.5; break;
case 'headbutt': aStam = 2.0; break;
}
stamCost = Math.ceil(aStam*rStam);
DEF.STATS.PHY+= Math.min(DEF.STATS.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.debugInfo ? " <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;
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;
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)/setup.ENGINE.sqrt(adRatio, '+');
tuf = Math.max(1, Math.min(tuf, dE.tough))/setup.ENGINE.sqrt(adRatio, '+');
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));
break;
default: break;
}
/* chance to hit/crit/counter */
hit = attRoll/defRoll * hitRate;
crit = attCrit/defCrit * critRate;
/* costs twice as much to swing and miss, half as much to counter... */
stamCost = Math.ceil(aStam*rStam / (counter ? 2 : (hit<0.5 ? 0.5 : 1)));
/* hits get rougher the longer the fight goes */
dmg = Math.ceil((dmg/defGuard) + stamCost);
tuf = Math.ceil((tuf/defGuard) + (aCal/dCal*aLv));
dK = setup.ENGINE.sqrt(dmg, '-')/adRatio;
switch(true) {
case (!limbTest):
RESULT.type = 'limbFail';
RESULT['hit_msg'] = limbFail;
break;
/* COUNTER */
case (((hit+crit)<0.3) && !counter && !DEF.stun):
return setup.ENGINE.combatStrike(DEF, ATT, action, 'counter');
break;
/* MISS */
case (hit<0.5):
dmg = 0;
tuf = 0;
RESULT.type = 'miss';
RESULT['hit_msg']= aName +' tried to '+ action +' <hint>wasting '+ stamCost +' stamina</hint>, but '+ dName +' wasn't there...' +(settings.debugInfo ? " <span class='tiny'>[MISS: "+ action +"]</span>" :'');
break;
/* HIT */
case (crit<0.7):
dmg *= Math.ceil(1+(hit/10));
/* TRY TO HOLD BACK */
if(cap) {
dmg=Math.ceil(Math.min(dmg, cap*(0.5+Math.random())));
tuf=Math.ceil(Math.min(tuf, cap*(0.5+Math.random())/5));
}
RESULT.type = 'hit';
RESULT['hit_msg']= aName +' '+ verb +' '+ dName +' for '+ (dmg+tuf) +' damage <hint>expending '+ stamCost +' stamina</hint>.' +(settings.debugInfo ? " <span class='tiny'>[HIT: "+ action +"]</span>" :'');
break;
/* CRIT */
default:
dmg *= Math.ceil((1+setup.ENGINE.sqrt(crit, '-'))*(1+(hit/10)));
/* TRY TO HOLD BACK */
if(cap) {
dmg=Math.ceil(Math.min(dmg, cap*(0.5+Math.random())*2));
tuf=Math.ceil(Math.min(tuf, cap*(0.5+Math.random())/2));
}
tuf *= 3;
RESULT.type = 'crit';
RESULT['hit_msg']= aName +' slams '+ dName +' with a '+ action +' for '+ (dmg+tuf) +'! <hint>using '+ stamCost +' stamina</hint>' +(settings.debugInfo ? " <span class='tiny'>[CRIT: "+ action +"]</span>" :'');
break;
}
var PARAMS = {
'ATT' : ATT,
'DEF' : DEF,
'RESULT': RESULT,
'cap' : cap,
};
dmg = setup.ENGINE.putInBounds(dmg, 'combatStrike-dmg', PARAMS);
tuf = setup.ENGINE.putInBounds(tuf, 'combatStrike-tuf', PARAMS);
stamCost = setup.ENGINE.putInBounds(stamCost, 'combatStrike-stamCost', PARAMS);
DEF.MATRIX.tough -= tuf;
ATT.MATRIX.tough -= tuf/10;
aE.vigor -= stamCost;
setup.ENGINE.qiAdd(- dmg, DEF);
/* gain tops out at gMul% current stats */
if(!DEF.dead) {
aS.STR+= Math.min(aS.STR*(gMulAtt/100), gMulAtt * (0.0011 + ( (setup.ENGINE.pow(dS.STR, 1/3, '+') / 1000) * Math.random() * 3)) );
aS.PHY+= Math.min(aS.PHY*(gMulAtt/100), gMulAtt * (0.0015 + ( (setup.ENGINE.pow(stamCost, 1/3, '+') / 1000) * Math.random() * 3)) );
aS.INS+= Math.min(aS.INS*(gMulAtt/100), gMulAtt * (0.0017) );
dS.END+= Math.min(dS.END*(gMulDef/100), gMulDef * (0.0009 + ( (setup.ENGINE.pow(dmg, 1/3, '+') / 10000) * Math.random() * 3 )) *defGuard );
dS.SPD+= Math.min(dS.SPD*(gMulDef/100), gMulDef * (0.0021) *defGuard );
dS.WSD+= Math.min(dS.WSD*(gMulDef/100), gMulDef * (0.0012) *defGuard );
dS.STR+= Math.min(aS.STR*(gMulAtt/100), gMulDef * (0.0011 + ( (setup.ENGINE.pow(aS.STR, 1/3, '+') / 1000) * Math.random() * 3)) );
aS.SPD+= Math.min(aS.SPD*(gMulDef/100), gMulDef * (0.0021) );
setup.ENGINE.darkAdd( 3*aLv +dK, ATT);
setup.ENGINE.lightAdd(3*aLv +dK, DEF);
}
/* regen+flow, or decay */
setup.ENGINE.qiFlow(0.034, 1, ATT); setup.ENGINE.do_status_update(ATT);
setup.ENGINE.qiFlow(0.034, 1, DEF); setup.ENGINE.do_status_update(DEF);
RESULT['cnd_msg']= dName +' '+ setup.ENGINE.fighterCondition(DEF);
return RESULT;
},
'combatWithdraw' : function(ATT, DEF, action) {
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;
var aE = ATT.MATRIX; var aS = ATT.STATS; var aLv = aS.level; var aCal = aS.caliber; var aMin = aLv*aCal;
var dE = DEF.MATRIX; var dS = DEF.STATS; var dLv = dS.level; var dCal = dS.caliber; var dMin = dLv*dCal;
var sMsg = ''; var fMsg = ''; var tMsg = '';
var attThem = setup.ENGINE.him_her(ATT.gender||ATT.TRAITS.gender);
var defThem = setup.ENGINE.him_her(DEF.gender||DEF.TRAITS.gender);
var withdraw = 0.0;
var tkLight = aE.light+dE.light;
var tkDark = aE.dark+dE.dark;
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));
defPow = Math.max(0.1, (dE.power + dE.skill + dE.fight + dE.vigor + dE.focus));
attRoll = setup.ENGINE.rand(0.1, 6.0);
defRoll = setup.ENGINE.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) * setup.ENGINE.rand(0.34, 1.34) );
aE.train -= Math.max( aMin, (attPow/aS.PHY) * setup.ENGINE.rand(0.23, 1.16) );
aE.react -= Math.max( aMin, (attPow/aS.PHY) * setup.ENGINE.rand(0.23, 1.16) );
aE.vigor -= Math.max( aMin, (attPow/aS.PHY) * setup.ENGINE.rand(0.42, 3.16) );
aE.aware -= Math.max( aMin, (attPow/aS.PHY) * setup.ENGINE.rand(0.23, 1.16) );
/* DEF burn energy trying to chase... */
dE.power -= Math.max( dMin, (defPow/dS.PHY) * setup.ENGINE.rand(1.34, 3.46) );
dE.skill -= Math.max( dMin, (defPow/dS.PHY) * setup.ENGINE.rand(0.34, 2.16) );
dE.fight -= Math.max( dMin, (defPow/dS.PHY) * setup.ENGINE.rand(0.69, 2.16) );
dE.vigor -= Math.max( dMin, (defPow/dS.PHY) * setup.ENGINE.rand(1.69, 4.23) );
dE.focus -= Math.max( dMin, (defPow/dS.PHY) * setup.ENGINE.rand(0.16, 2.16) );
/* succeed or fail, the attempt to flee burns light karma */
setup.ENGINE.lightAdd(-(aMin*10), ATT);
setup.ENGINE.lightAdd(-(dMin*1), DEF);
/* stat bonus for the workout... */
ATT.STATS.PHY+= 0.069*attRoll; ATT.STATS.SPD+= 0.042*attRoll; ATT.STATS.END+= 0.034*attRoll;
DEF.STATS.PHY+= 0.069*defRoll; DEF.STATS.SPD+= 0.042*defRoll; DEF.STATS.STR+= 0.034*defRoll;
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 */
}
setup.ENGINE.qiFlow(0.134, 1, ATT); setup.ENGINE.do_status_update(ATT);
setup.ENGINE.qiFlow(0.069, 1, DEF); setup.ENGINE.do_status_update(DEF);
return RESULT;
},
'darkAdd' : function(amt, CHAR) {
CHAR=CHAR||$GAMEDATA.PC; CHAR.MATRIX.dark += amt; CHAR.MATRIX.light += amt * -0.5;
},
'darkShift' : function(amt, CHAR) {
CHAR=CHAR||$GAMEDATA.PC; 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) {
CHAR=CHAR||$GAMEDATA.PC; setup.ENGINE.karmaAdd(-amt, CHAR); setup.ENGINE.darkShift(amt*3, CHAR);
},
'debugClear' : function() {
return;
if( settings.debugInfo && window.console && window.console.clear) { window.console.clear(); }
},
'debugLog' : function(msg) {
if( settings.debugInfo && window.console && window.console.log) { window.console.log(msg); }
},
'degF2C' : function(deg) { return (deg-32)/1.8; },
'delItem' : function(item_id, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
delete CHAR.STUFF[item_id];
return true;
},
'depleteItem' : function(item_id, qty, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
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 desc = '';
if(setup.DESC[trait]) {
desc = setup.DESC[trait](CHAR);
} else {
desc = setup.ENGINE.descMissing(trait);
}
return desc;
},
'descAge' : function(age) {
var desc = '';
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>";
},
'describePassage' : function(passage) {
passage=passage||State.passage;
var desc='';
if( $GAMEDATA.PC.STATE.lastPassage==passage ) {
desc=$GAMEDATA.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 'SHOP 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) {
CHAR=CHAR||$GAMEDATA.PC;
/* cost = next_level^3 *100; */
},
'do_status_update' : function(CHAR){
CHAR=CHAR||$GAMEDATA.PC;
setup.ENGINE.versionUpdate();
setup.ENGINE.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; }
CHAR.STATS.level = ( CHAR.STATS.STR + CHAR.STATS.END + CHAR.STATS.SPD + CHAR.STATS.PHY + CHAR.STATS.INS + CHAR.STATS.WSD ) / 6;
CHAR.STATS.caliber = setup.ENGINE.unstack(CHAR.STATS.level);
CHAR.STATS.workout_hrs = setup.ENGINE.stack(CHAR.STATS.level)/60;
CHAR.STATS.karmic_well = setup.ENGINE.calcKarmicWell(CHAR.STATS);
/* set metrics */
setup.ENGINE.update_bodysize(CHAR);
CHAR.METRICS.wt = Math.max(CHAR.METRICS.wt, 0.01);
CHAR.METRICS.ht = Math.max(CHAR.METRICS.ht, 0.01);
/* put stats in upper bounds, do one cycle at 1/1000 decay */
setup.ENGINE.energyBleedOff(1, 0.001, CHAR);
setup.ENGINE.updateConditions(CHAR);
if(CHAR===$GAMEDATA.PC) { setup.ENGINE.update_world(CHAR); }
setup.ENGINE.after_update(CHAR);
setup.ENGINE.refresh_detail();
},
'doExplore' : function(activity, hours, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
hours=setup.ENGINE.putInBounds(hours||setup.ACTIONS.EXPLORE[activity].hours, 'doExplore-hours');
var act = Object.assign({}, setup.ACTIONS.EXPLORE[activity].MATRIX);
var bodymass = setup.ENGINE.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;
setup.ENGINE.doEnergyMATRIX(act, hours);
/* ACTION EVENT CALLBACK */
if(typeof setup.ACTIONS.EXPLORE[activity].onAction == 'function') { setup.ACTIONS.EXPLORE[activity].onAction(hours); }
$GAMEDATA.PC.STATE.lastActivity = activity;
$GAMEDATA.PC.STATE.lastAction = 'explore';
/* Adjust the clock */
setup.ENGINE.passTime(hours, CHAR);
return true;
},
'doDamageMATRIX' : function(MATRIX, total, units, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
units=units||1;
total=total||1;
MATRIX=setup.ENGINE.prepMATRIX(MATRIX);
total = MATRIX['prepMATRIX-total'];
delete MATRIX['prepMATRIX-total'];
var B = CHAR.BODY;
var S = CHAR.STATS;
var cal = S.caliber;
var phyRt = setup.ENGINE.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 = setup.ENGINE.pow(lv/cal, 2, '-')/16;
var damage = 0.0;
var fatigue = 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*(cal-B[part].train)/cal);
fatigue = damage*(42/(cal+phyRt));
B[part].damage += damage;
B[part].train += damage/(42*cal);
B[part].fatigue += fatigue;
}
});
setup.ENGINE.doTrainingMATRIX( MATRIX, total, (0.042/cal), CHAR);
},
'doEnergyMATRIX' : function(MATRIX, units, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
if(typeof units==='undefined' || isNaN(units)) units=1;
units=setup.ENGINE.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):
setup.ENGINE.karmaAdd(MATRIX[resource] * units, CHAR);
break;
case ('qi'==resource):
setup.ENGINE.qiAdd(MATRIX[resource] * units, CHAR);
break;
default:
CHAR.MATRIX[resource] += (MATRIX[resource] * units);
if(MATRIX[resource]>0) {
CHAR.MATRIX[resource] *= (1+(Math.random()*setup.ENGINE.sqrt(MATRIX[resource] * units, '0')/100));
}
break;
}
if(isNaN(CHAR.MATRIX[resource])) { try { $GAMEDATA.ERRORS.NaN['char-'+resource]= ($GAMEDATA.ERRORS.NaN['char-'+resource]+1)||1; } catch(e) {} }
});
/* make sure we have not exceeded max, and apply any status changes */
setup.ENGINE.do_status_update(CHAR);
return true;
},
'doTrainingMATRIX' : function(MATRIX, total, units, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
units=units||1;
total=total||1;
Object.keys(MATRIX).forEach(function(part) {
CHAR.BODY[part].train+=(MATRIX[part]*units/total);
});
},
'doLift' : function(workout, weight, bonus, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
workout=workout||_workout;
weight=weight||_weight;
bonus=bonus||_bonus;
var cal = CHAR.STATS.caliber;
var reps = setup.ENGINE.calcReps(workout, weight, CHAR);
var out = '';
if(setup.ENGINE.canDo('TRAIN', setup.WORKOUTS[workout].action, 0.1, 0.5, CHAR)) {
if(reps>=1.0) {
$GAMEDATA.WORLD.girlPower += 0.001;
setup.ENGINE.doDamageMATRIX( setup.WORKOUTS[workout].MATRIX, setup.WORKOUTS[workout].total, 1.0, CHAR);
setup.ENGINE.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 "+ setup.ENGINE.formatWeight(weight, settings.units, false) +(weight<0 ? ' assist.' : ' load.');
CHAR.STATS[bonus] += (0.001*cal);
} else {
/* do more muscle damage on a failed lift... */
switch(true) {
case (reps<0.50):
$GAMEDATA.WORLD.girlPower -= 0.001;
setup.ENGINE.doDamageMATRIX( setup.WORKOUTS[workout].MATRIX, setup.WORKOUTS[workout].total, 4.0, CHAR);
CHAR.STATS[bonus] += 0.001;
out = "You try with all your might, but can't even budge the weight.";
break;
case (reps<0.75):
setup.ENGINE.doDamageMATRIX( setup.WORKOUTS[workout].MATRIX, setup.WORKOUTS[workout].total, 3.0, CHAR);
CHAR.STATS[bonus] += 0.001;
out = "You made it almost halfway, before you're muscles gave out.";
break;
case (reps<1.00):
setup.ENGINE.doDamageMATRIX( setup.WORKOUTS[workout].MATRIX, setup.WORKOUTS[workout].total, 2.0, CHAR);
CHAR.STATS[bonus] += 0.001;
out = "You almost had it, but couldn't quite finish the rep.";
break;
}
}
/* 5 min allocated, but only 1 min workout... */
setup.ENGINE.doWorkout(setup.WORKOUTS[workout].action, 1/60, 0.42+(cal*cal/3), CHAR);
setup.ENGINE.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 += setup.ENGINE.listMuscleStatus();
return out;
},
'doRest' : function(activity, hours, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
hours=setup.ENGINE.putInBounds(hours||setup.ACTIONS.REST[activity].hours, 'doRest-hours');
var bodymass = Math.round(setup.ENGINE.calcBodyMass(CHAR));
/* PROCESS REST MATRIX */
var act = Object.assign({}, setup.ACTIONS.REST[activity].MATRIX);
act.kcal*= bodymass; act.protein*= bodymass; act.sugar*= bodymass;
setup.ENGINE.doEnergyMATRIX(act, hours);
/* ACTIVE REGEN and slow-bleedoff */
setup.ENGINE.energyBleedOff(hours/2, null, CHAR);
setup.ENGINE.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); }
$GAMEDATA.PC.STATE.lastActivity = activity;
$GAMEDATA.PC.STATE.lastAction = 'rest';
/* Adjust the clock */
setup.ENGINE.passTime(hours, CHAR);
/* Update status again, as weight may have changed */
setup.ENGINE.do_status_update(CHAR);
return true;
},
'doWorkout' : function(activity, hours, level, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
level=setup.ENGINE.putInBounds(level||1.0, 'doWorkout-level');
hours=setup.ENGINE.putInBounds(hours||Math.min(setup.ACTIONS.TRAIN[activity].hours,setup.ENGINE.maxHours('TRAIN', activity, level, CHAR)), 'doWorkout-hours');
var act = Object.assign({}, setup.ACTIONS.TRAIN[activity].MATRIX);
var bodymass = setup.ENGINE.calcBodyMass(CHAR);
var effort = hours*level;
$GAMEDATA.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;
setup.ENGINE.doEnergyMATRIX(act, effort, CHAR);
setup.ENGINE.trainSTATS(act, effort, CHAR);
/* ACTION EVENT CALLBACK */
if(typeof setup.ACTIONS.TRAIN[activity].onAction == 'function') { setup.ACTIONS.TRAIN[activity].onAction(hours); }
$GAMEDATA.PC.STATE.lastExercise = activity;
$GAMEDATA.PC.STATE.lastActivity = activity;
$GAMEDATA.PC.STATE.lastAction = 'workout';
/* Adjust the clock */
setup.ENGINE.passTime(hours, CHAR);
return true;
},
'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;
},
'enemyBigger' : function(ENEMY, pct) {
var S = ENEMY.STATS;
var M = ENEMY.METRICS;
var E = ENEMY.MATRIX;
var AzI = $GAMEDATA.WORLD.amazonIndex;
var they = setup.ENGINE.he_she(ENEMY.gender||ENEMY.TRAITS.gender);
pct += ('she'==they ? (pct+(AzI/100)) : 0);
for(var i=0; i<(pct*200); i++) {
setup.ENGINE.statAdd(either('SPD','END','WSD','PHY','STR','INS'), 1.0, ENEMY);
}
setup.ENGINE.statAdd('SPD', S.SPD * ((pct*setup.ENGINE.rand(0.80, 1.10))), ENEMY);
setup.ENGINE.statAdd('END', S.END * ((pct*setup.ENGINE.rand(0.90, 1.15))), ENEMY);
setup.ENGINE.statAdd('WSD', S.WSD * ((pct*setup.ENGINE.rand(0.50, 0.85))), ENEMY);
setup.ENGINE.statAdd('PHY', S.PHY * ((pct*setup.ENGINE.rand(0.70, 0.95))), ENEMY);
setup.ENGINE.statAdd('STR', S.STR * ((pct*setup.ENGINE.rand(1.00, 1.20))), ENEMY);
setup.ENGINE.statAdd('INS', S.INS * ((pct*setup.ENGINE.rand(0.60, 0.90))), ENEMY);
M.ht += (S.caliber*pct)/5;
M.wt += (S.caliber*(1+(pct*1.0)))/2;
/* scale energy levels to new max */
setup.ENGINE.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) {
CHAR=CHAR||$GAMEDATA.PC;
/* TODO: ensure every NPC has a UID, and adjust array-keys accordingly */
var uid = WHO.uid||WHO.name;
delete CHAR.ENEMIES[uid];
setup.ENGINE.npcForget(WHO, CHAR, 'enemy');
},
'enemyRemember' : function(WHO, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
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;
setup.ENGINE.npcRemember(WHO, CHAR, 'enemy');
},
'npcForget' : function(WHO, CHAR, role) {
CHAR=CHAR||$GAMEDATA.PC;
if(!WHO.REF) { WHO.REF={}; }
var refKey = CHAR.name +':'+ role;
delete WHO.REF[refKey];
if(WHO.REF.length<1 && WHO.uid && $GAMEDATA.WORLD.NPCS[WHO.uid]) {
delete $GAMEDATA.WORLD.NPCS[(WHO.uid||WHO.name)];
}
},
'npcRemember' : function(WHO, CHAR, role) {
CHAR=CHAR||$GAMEDATA.PC;
if(!WHO.REF) { WHO.REF={}; }
var refKey = CHAR.name +':'+ role;
WHO.REF[refKey] = {
'char': CHAR.name,
'role': role,
'when': new Date,
};
if(WHO.uid && !$GAMEDATA.WORLD.NPCS[WHO.uid]) {
$GAMEDATA.WORLD.NPCS[WHO.uid] = WHO;
}
},
'energyBleedOff' : function(cycles, loss, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
cycles = cycles || 1.0;
loss = loss || 0.1;
var rate = 1 - loss;
var falloff = setup.ENGINE.pow(rate, cycles, '-');
var E = CHAR.MATRIX;
var S = CHAR.STATS;
var kfalloff = setup.ENGINE.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.regen = Math.min( E.regen, (S.SPD * S.END)*3 );
E.react = Math.min( E.react, (S.SPD * S.WSD)*3 );
E.metab = Math.min( E.metab, (S.SPD * S.PHY)*3 );
E.power = Math.min( E.power, (S.SPD * S.STR)*3 );
E.fight = Math.min( E.fight, (S.SPD * S.INS)*3 );
E.guard = Math.min( E.guard, (S.END * S.WSD)*3 );
E.vital = Math.min( E.vital, (S.END * S.PHY)*3 );
E.tough = Math.min( E.tough, (S.END * S.STR)*3 );
E.force = Math.min( E.force, (S.END * S.INS)*3 );
E.aware = Math.min( E.aware, (S.WSD * S.PHY)*3 );
E.train = Math.min( E.train, (S.WSD * S.STR)*3 );
E.psych = Math.min( E.psych, (S.WSD * S.INS)*3 );
E.vigor = Math.min( E.vigor, (S.PHY * S.STR)*3 );
E.focus = Math.min( E.focus, (S.PHY * S.INS)*3 );
E.skill = Math.min( E.skill, (S.STR * S.INS)*3 );
CHAR.MATRIX.light = Math.min(CHAR.MATRIX.light, CHAR.STATS.karmic_well*CHAR.STATS.level);
CHAR.MATRIX.dark = Math.min(CHAR.MATRIX.dark , CHAR.STATS.karmic_well*CHAR.STATS.level);
setup.ENGINE.qiCalc(CHAR);
/* bleed off excessive energy at 10% per cycle */
if(E.regen>(S.SPD * S.END)) { E.regen *= falloff; }
if(E.react>(S.SPD * S.WSD)) { E.react *= falloff; }
if(E.metab>(S.SPD * S.PHY)) { E.metab *= falloff; }
if(E.power>(S.SPD * S.STR)) { E.power *= falloff; }
if(E.fight>(S.SPD * S.INS)) { E.fight *= falloff; }
if(E.guard>(S.END * S.WSD)) { E.guard *= falloff; }
if(E.vital>(S.END * S.PHY)) { E.vital *= falloff; }
if(E.tough>(S.END * S.STR)) { E.tough *= falloff; }
if(E.force>(S.END * S.INS)) { E.force *= falloff; }
if(E.aware>(S.WSD * S.PHY)) { E.aware *= falloff; }
if(E.train>(S.WSD * S.STR)) { E.train *= falloff; }
if(E.psych>(S.WSD * S.INS)) { E.psych *= falloff; }
if(E.vigor>(S.PHY * S.STR)) { E.vigor *= falloff; }
if(E.focus>(S.PHY * S.INS)) { E.focus *= falloff; }
if(E.skill>(S.STR * S.INS)) { E.skill *= falloff; }
/* bleed off excessive karma at 1% per cycle */
if(E.light>S.karmic_well) { E.light *= kfalloff; }
if(E.dark >S.karmic_well) { E.dark *= kfalloff; }
},
'equipItem' : function(item_id, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
/* broken, allows ANY item to be equipped on ANY slot */
var slot_id = setup.ENGINE.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;
}
},
'estAge' : function(age) {
var est = '';
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.toFixed(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;
},
'exitPassage' : function(encounter, passage) {
passage=passage||State.passage;
encounter=encounter||_encounter;
if(setup.ENCOUNTERS[encounter].overrideExit) {
return '';
} else {
return setup.PASSAGES[passage].exit();
setup.ENGINE.showSideBar();
}
},
'fighterCondition' : function(CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
var desc = null;
var stun = false;
switch(true) {
case (CHAR.STATUS.qi=='killed'): desc=' is dead.'; stun=true; break;
case (CHAR.STATUS.qi=='unconscious'): desc=' is out cold.'; 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;
},
'findCash' : function(min_find, max_find, karmic_boost, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
min_find=setup.ENGINE.putInBounds(min_find|| 3, 'findCash-min_find');
max_find=setup.ENGINE.putInBounds(max_find||300, 'findCash-max_find');
if(typeof karmic_boost==='undefined') { karmic_boost=true; }
var k_mul = (karmic_boost ? 0.1 + (setup.ENGINE.sqrt(setup.ENGINE.getTotalKarma(CHAR), '0')/1000) : 1 );
var found = Math.floor(
(Math.random()*(max_find-min_find)+min_find)*k_mul
);
/* grr.... */
/* if(isNaN(found)) { found=0; } */
return found;
},
'findChange' : function(min_find, max_find, karmic_boost, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
min_find=setup.ENGINE.putInBounds(min_find|| 30, 'findChange-min_find');
max_find=setup.ENGINE.putInBounds(max_find||300, 'findChange-max_find');
if(typeof karmic_boost==='undefined') { karmic_boost=true; }
var k_mul = (karmic_boost ? 0.1 + (setup.ENGINE.logX(10, setup.ENGINE.getTotalKarma(CHAR), '0')*CHAR.STATS.caliber/100) : 1 );
return Math.floor(
(Math.random()*(max_find-min_find)+min_find)*k_mul
)/100;
},
'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.ENGINE.firstKey(KEYS, OBJ);
return OBJ[key] || null;
},
'fixDate' : function(dateObj) {
dateObj=dateObj||$GAMEDATA.PC.STATE.Date;
if(isNaN(dateObj.getTime())) {
dateObj = new Date();
}
if(isNaN($GAMEDATA.PC.STATE.Date.getTime())) {
$GAMEDATA.PC.STATE.Date = dateObj;
setup.ENGINE.brokeTime($GAMEDATA.PC);
}
},
'foodCard' : function(item_id) {
var ITEM = setup.ITEMS[item_id];
/* REQUIRES _SOURCE_CHAR & _TARGET_CHAR TO BE SET BEFORE CALLING THIS... */
/* setup.ENGINE.WTF(item_id, true); */
var i_open = _uses % setup.ITEMS[item_id].uses;
var i_pack = setup.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/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.kcal) +"</span>
<span>Protein:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.protein) +"g</span>
<span>Sugar:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.sugar) +"g</span>
"+(settings.lod_energyMatrix ? "
<span>regen:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.regen) +"</span>
<span>react:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.react) +"</span>
<span>metab:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.metab) +"</span>
<span>power:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.power) +"</span>
<span>fight:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.fight) +"</span>
<span>guard:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.guard) +"</span>
<span>vital:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.vital) +"</span>
<span>tough:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.tough) +"</span>
<span>force:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.force) +"</span>
<span>aware:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.aware) +"</span>
<span>train:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.train) +"</span>
<span>psych:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.psych) +"</span>
<span>vigor:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.vigor) +"</span>
<span>focus:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.focus) +"</span>
<span>skill:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.skill) +"</span>
" : '')+"
</div>
</div>
</div>
<div class='bottom_bar glass'>Use:
<span class='link'>
<<link '[one]'>>
<<run setup.ENGINE.useItem( '"+ item_id +"', 1, _SOURCE_CHAR, _TARGET_CHAR ); >>
<<replace '#"+ item_id +"'>><<print setup.ENGINE.foodCard('"+ item_id +"');>><</replace>>
<</link>>
</span>
<<if "+ i_uses+ ">9>>
<span class='link'>
<<link '[ten]'>>
<<run setup.ENGINE.useItem( '"+ item_id +"', 10, _SOURCE_CHAR, _TARGET_CHAR ); >>
<<replace '#"+ item_id +"'>><<print setup.ENGINE.foodCard('"+ item_id +"');>><</replace>>
<</link>>
</span>
<</if>>
<<if "+ i_open +">0>>
<span class='link'>
<<link '[pack]'>>
<<run setup.ENGINE.useItem( '"+ item_id +"', "+ i_open +", _SOURCE_CHAR, _TARGET_CHAR ); >>
<<replace '#"+ item_id +"'>><<print setup.ENGINE.foodCard('"+ item_id +"');>><</replace>>
<</link>>
</span>
<<elseif "+ i_uses +">="+ i_pack +">>
<span class='link'>
<<link '[pack]'>>
<<run setup.ENGINE.useItem( '"+ item_id +"', "+ i_pack +", _SOURCE_CHAR, _TARGET_CHAR ); >>
<<replace '#"+ item_id +"'>><<print setup.ENGINE.foodCard('"+ item_id +"');>><</replace>>
<</link>>
</span>
<</if>>
<<if "+ i_uses+ ">99>>
<span class='link'>
<<link '[100]'>>
<<run setup.ENGINE.useItem( '"+ item_id +"', 100, _SOURCE_CHAR, _TARGET_CHAR ); >>
<<replace '#"+ item_id +"'>><<print setup.ENGINE.foodCard('"+ item_id +"');>><</replace>>
<</link>>
</span>
<</if>>
</div>
";
},
'formatAsPct' : function(floatVal, decimalPlaces) {
decimalPlaces=decimalPlaces||0;
return ((floatVal*100).toFixed(decimalPlaces) +'%');
},
'formatHeight' : function(ht, units) {
units=units||settings.units;
return setup.ENGINE.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).toFixed(1) +' km'; break;
case (cm>PARAM['cm2m' ]): out = (cm/cm2m ).toFixed(1) +' m'; break;
default: out = (cm/ 1).toFixed(1) +' cm'; break;
}
break;
case ("Imperial"==settings.units):
var in2ft = 12;
var in2mi = 12*5280;
switch(true) {
case (len>in2mi): out = (len/in2mi).toFixed(1) +' mi'; break;
case (len>PARAM['in2ft']): out = setup.ENGINE.in2ft(len); break;
default: out = (len/ 1).toFixed(1) +'"'; break;
}
break;
}
return out;
},
'formatMatrixValue' : function(value) {
if((typeof value=='undefined')||value==0) {
return '-';
}
return (value>0 ? '+' : '')+ value.toFixed(1);
},
'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).toFixed(1) +' '+ (abv ?'E' :('Metric'==settings.units ?'exa' :'quintillion-' ) ) + unit; break;
case (scale == 5): out=(sign*abs).toFixed(1) +' '+ (abv ?'P' :('Metric'==settings.units ?'peta' :'quadrillion-' ) ) + unit; break;
case (scale == 4): out=(sign*abs).toFixed(1) +' '+ (abv ?'T' :('Metric'==settings.units ?'tera' :'trillion-' ) ) + unit; break;
case (scale == 3): out=(sign*abs).toFixed(1) +' '+ (abv ?'G' :('Metric'==settings.units ?'giga' :'billion-' ) ) + unit; break;
case (scale == 2): out=(sign*abs).toFixed(1) +' '+ (abv ?'M' :('Metric'==settings.units ?'mega' :'million-' ) ) + unit; break;
case (scale == 1): out=(sign*abs).toFixed(1) +' '+ (abv ?'k' :('Metric'==settings.units ?'kilo' :'thousand-' ) ) + unit; break;
case (scale == 0): out=(sign*abs).toFixed(1) +' '+ (abv ?'' :('Metric'==settings.units ?'' :'' ) ) + unit; break;
case (scale == -1): out=(sign*abs).toFixed(1) +' '+ (abv ?'m' :('Metric'==settings.units ?'milli' :'thousandth-' ) ) + unit; break;
case (scale == -2): out=(sign*abs).toFixed(1) +' '+ (abv ?'μ' :('Metric'==settings.units ?'micro' :'millionth-' ) ) + unit; break;
case (scale == -3): out=(sign*abs).toFixed(1) +' '+ (abv ?'n' :('Metric'==settings.units ?'nano' :'billionth-' ) ) + unit; break;
case (scale == -4): out=(sign*abs).toFixed(1) +' '+ (abv ?'p' :('Metric'==settings.units ?'pico' :'trillionth-' ) ) + unit; break;
case (scale == -5): out=(sign*abs).toFixed(1) +' '+ (abv ?'f' :('Metric'==settings.units ?'femto' :'quadrillionth-' ) ) + unit; break;
case (scale == -6): out=(sign*abs).toFixed(1) +' '+ (abv ?'a' :('Metric'==settings.units ?'atto' :'quintillionth-' ) ) + unit; break;
default: break;
}
return out;
},
'formatWeight' : function(wt, units, abv) {
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 = setup.ENGINE.formatScale(kg*kg2g, (abv ?'g' :'gram'), abv); break;
case (Math.abs(kg) > kg2t ): out = setup.ENGINE.formatScale(kg/kg2t, (abv ?'t' :'ton' ), abv); break;
default: out = (kg/1).toFixed(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 = setup.ENGINE.formatScale(wt*lb2oz, (abv ?'oz' :'ounce' ), abv); break;
case (Math.abs(wt) > lb2tn ): out = setup.ENGINE.formatScale(wt/lb2tn, (abv ?'tn' :'ton' ), abv); break;
default: out = (wt/1).toFixed(1) +(abv ?' lb' : ' pound'); break;
}
break;
}
return out;
},
'generateBlankChar' : function(LICENSE, PARAMS) {
PARAMS=PARAMS||{};
var CHAR = {
'NAMES' : {},
'TRAITS' : {},
'PASSAGES' : {},
'STATS' : {},
'MATRIX' : {},
'METRICS' : {},
'STATUS' : {},
'STUFF' : {},
'EQUIP' : {},
'PROPERTY' : {},
'STATE' : {},
'SLAVES' : {},
'ENEMIES' : {},
'FRIENDS' : {},
'LOVERS' : {},
'POWERS' : {},
'SKILLS' : {},
'DEVICES' : {},
'BODY' : {},
'IS' : {},
'BS' : {},
'ES' : {},
'EQ' : {},
};
return CHAR;
},
'generateCharFromLicense' : function(LICENSE) {
var PARTIAL = setup.ENGINE.generateBlankChar();
PARTIAL['name'] = LICENSE.name;
PARTIAL['name_first'] = LICENSE.name.split(' ')[0];
PARTIAL['age'] = LICENSE.age;
PARTIAL['gender'] = LICENSE.gender;
PARTIAL['genpro'] = LICENSE.genpro;
PARTIAL['ht'] = setup.ENGINE.formatHeight(LICENSE.ht);
PARTIAL['wt'] = setup.ENGINE.formatWeight(LICENSE.adj_wt);
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['uid'] = setup.ENGINE.generateUID_fromName(PARTIAL.name);
return PARTIAL;
},
'generateRandomEncounterMatrix' : function(STATS, min, max) {
min=min||0.5;
max=max||2.0;
var MATRIX = {
'regen' : (STATS.SPD * STATS.END),
'react' : (STATS.SPD * STATS.WSD),
'metab' : (STATS.SPD * STATS.PHY),
'power' : (STATS.SPD * STATS.STR),
'fight' : (STATS.SPD * STATS.INS),
'guard' : (STATS.END * STATS.WSD),
'vital' : (STATS.END * STATS.PHY),
'tough' : (STATS.END * STATS.STR),
'force' : (STATS.END * STATS.INS),
'aware' : (STATS.WSD * STATS.PHY),
'train' : (STATS.WSD * STATS.STR),
'psych' : (STATS.WSD * STATS.INS),
'vigor' : (STATS.PHY * STATS.STR),
'focus' : (STATS.PHY * STATS.INS),
'skill' : (STATS.STR * STATS.INS),
};
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) {
var T = PCHAR.TRAITS;
var M = PCHAR.METRICS;
var f = T.gender=='female';
var m = T.gender=='male';
var scale = setup.ENGINE.pow((((M.ht+(M.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 STATS = {
'STR' : (2.0*(m?3.5:1.5))+Math.max(1, ( setup.ENGINE.randomStat(21,11) * either(scaleup, halfdown, halfup ) )-(M.age/ 5) ),
'END' : (2.2*(m?2.8:1.4))+Math.max(1, ( setup.ENGINE.randomStat(11, 6) * either(scaleup, halfdown, halfup ) )+(M.age/20) ),
'SPD' : (2.4*(m?2.2:1.3))+Math.max(1, ( setup.ENGINE.randomStat(13, 7) * either(halfup, halfdown, halfdown) )-(M.age/20) ),
'PHY' : (2.6*(m?1.7:1.2))+Math.max(1, ( setup.ENGINE.randomStat(17, 9) * either(halfup, halfup, halfdown) )-(M.age/10) ),
'INS' : (2.8*(m?1.3:1.1))+Math.max(1, ( setup.ENGINE.randomStat( 9, 5) * either(scaledown, halfup, halfdown) )+(M.age/10) ),
'WSD' : (3.0*(m?1.0:1.0))+Math.max(1, ( setup.ENGINE.randomStat( 7, 4) * either(scaledown, halfup, halfdown) )+(M.age/ 5) ),
};
STATS = setup.ENGINE.azIScaleStats(T.gender, STATS, {'BASE':{ 'STR':5, 'END':4, 'SPD':4, 'PHY':4, 'INS':3, 'WSD':3 }});
STATS.karmic_well = setup.ENGINE.calcKarmicWell(STATS);
STATS.level = ( STATS.STR + STATS.END + STATS.SPD + STATS.PHY + STATS.INS + STATS.WSD ) / 6;
STATS.caliber = setup.ENGINE.unstack(STATS.level);
return STATS;
},
/* TODO: update saves by generating UIDs for any npc missing one... */
'generateUID_fromName' : function(npc_name) {
var CHAR = $GAMEDATA.PC;
var WORLD = $GAMEDATA.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;
},
'getAisleName' : function(aisle) {
var dept = aisle.substr(0,3);
return setup.AISLES[dept].AISLES[aisle].name.toLowerCase();
},
'getBalanceDark' : function(CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
return CHAR.MATRIX.dark / (CHAR.MATRIX.light + CHAR.MATRIX.dark);
},
'getBalanceLight' : function(CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
return CHAR.MATRIX.light / (CHAR.MATRIX.light + CHAR.MATRIX.dark);
},
'getDate' : function(dateObj) {
dateObj=dateObj||$GAMEDATA.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||$GAMEDATA.PC.STATE.Date; return ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'][dateObj.getDay()]; },
'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;
}
},
'getFeedback' : function() {
var feedback = '';
if(($GAMEDATA.PC.STATE)&&($GAMEDATA.PC.STATE.feedbackQueue)) {
feedback = $GAMEDATA.PC.STATE.feedbackQueue.shift();
}
return feedback;
},
'getItem' : function(item_id) {
return setup.ITEMS[item_id];
},
'getKarmicBalance' : function(CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
return (CHAR.MATRIX.light - CHAR.MATRIX.dark) / (CHAR.MATRIX.light + CHAR.MATRIX.dark);
},
'getLongDate' : function(dateObj) { dateObj=dateObj||$GAMEDATA.PC.STATE.Date; return setup.ENGINE.getDay(dateObj) +', '+ setup.ENGINE.getMonth(dateObj) +' '+ dateObj.getDate() +', '+ dateObj.getFullYear(); },
'getMonth' : function(dateObj) { dateObj=dateObj||$GAMEDATA.PC.STATE.Date; return ['January','February','March','April','May','June','July','August','September','October','November','December'][dateObj.getMonth()]; },
'getName' : function(CHOICES, nomatch, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
nomatch=nomatch||'...';
/* return the first name-key matched */
var name=setup.ENGINE.firstVal(CHOICES, CHAR.NAMES);
if(!name) { name=nomatch; }
return name;
},
'getResource' : function(res, CHAR){
CHAR=CHAR||$GAMEDATA.PC;
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 = setup.ENGINE.maxResource(res, CHAR); break;
case 'light':
case 'dark' : max = CHAR.STATS.karmic_well; break;
case 'qi': max = CHAR.STATS.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= setup.ENGINE.logX(2.71828, CHAR.MATRIX[res]/max*30, '0')*25;
var val = (CHAR.MATRIX[res]).toFixed(digits);
if(isNaN(CHAR.MATRIX[res])) { try { $GAMEDATA.ERRORS.NaN['char-'+res]= ($GAMEDATA.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>"
}
},
'getTime' : function(format, dateObj) {
dateObj=dateObj||$GAMEDATA.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;
},
'getTotalKarma' : function(CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
return CHAR.MATRIX.light + CHAR.MATRIX.dark;
},
'giveFeedback' : function(msg) {
if(($GAMEDATA.PC.STATE)&&($GAMEDATA.PC.STATE.feedbackQueue)) {
$GAMEDATA.PC.STATE.feedbackQueue.push(msg);
}
},
'guideSubtopics' : function(SUBTOPICS) {
SUBTOPICS=SUBTOPICS||[];
var LINKS=[];
SUBTOPICS.forEach(function(topic) {
LINKS.push(setup.ENGINE.guideTopic(topic));
});
return "<span class='guide-subtopics'>"+ LINKS.join(', ') +"</span>";
},
'guideTopic' : function(topic) {
return "<<link '"+ topic +"'>><<set _topic='"+ topic +"'; setup.ENGINE.menuShow('guide'); >><</link>>";
},
'gym_getMuscles_forWorkout' : function(workout) {
var MUSCLES = {};
Object.keys(setup.WORKOUTS[workout].MATRIX).forEach(function(key) {
/* only list muscles affected by this workout */
if(('muscle'==setup.BODY[key].type)&&(setup.WORKOUTS[workout].MATRIX[key])&&(setup.WORKOUTS[workout].MATRIX[key]>0)) {
MUSCLES[key] = setup.WORKOUTS[workout].MATRIX[key] / setup.WORKOUTS[workout].total;
}
});
/* NOTE: due to ECMAScript property sorting limitations, this RETURNS a sorted ARRAY of KEYS ONLY, not a sorted KV-Object */
return setup.ENGINE.kvSort(MUSCLES);
},
'gym_getWorkouts_forMuscle' : function(muscle) {
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 setup.ENGINE.kvSort(WORKOUTS);
},
'gym_listLoadsForWorkout' : function(workout, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
workout=workout||_workout;
var hbw = (CHAR.METRICS.adj_wt * setup.WORKOUTS[workout].pbw)/2;
var out = '';
if(!setup.ENGINE.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 = (Math.min(CHAR.MATRIX.power-hbw, (CHAR.STATS.STR * CHAR.STATS.SPD)) + ((CHAR.METRICS.adj_wt-CHAR.METRICS.ht)/4)-hbw) * setup.WORKOUTS[workout].pls;
var units = setup.WORKOUTS[workout].units;
var LOADS = {};
switch(units) {
case 'challenges':
LOADS = {
};
break;
case 'positions':
LOADS = {
};
break;
case 'workouts':
LOADS = {
};
break;
case 'min':
LOADS={
'WORK SPD' :{ 'lnk':( (settings.debugInfo ? '[SPD+] ' : '')+ '<bb>HIGH INTENSITY </bb><ss>'+ (settings.debugInfo ? ' [4-6 reps @ 85%]' : '')+' (' + setup.ENGINE.formatWeight(lift*0.84)+')</ss>'), 'load':'heavy', 'weight':(lift*0.84), 'bonus':'SPD', 'units': 0, },
'WORK END' :{ 'lnk':( (settings.debugInfo ? '[END+] ' : '')+ '<bb>WORK TO EXHAUSTION </bb><ss>'+ (settings.debugInfo ? ' [30+ reps @ 50%]' : '')+' (' + setup.ENGINE.formatWeight(lift*0.49)+')</ss>'), 'load':'light', 'weight':(lift*0.48), 'bonus':'END', 'units': 0, },
'WORK WSD' :{ 'lnk':( (settings.debugInfo ? '[WSD+] ' : '')+ '<bb>WARM UP </bb><ss>'+ (settings.debugInfo ? ' [10 reps @ 25%]' : '')+' (' + setup.ENGINE.formatWeight(lift*0.24)+')</ss>'), 'load':'min', 'weight':(lift*0.24), 'bonus':'WSD', 'units': 0, },
'WORK PHY' :{ 'lnk':( (settings.debugInfo ? '[PHY+] ' : '')+ '<bb>ADD ISOMETRIC RESISTANCE </bb><ss>'+ (settings.debugInfo ? ' [6-12 reps @ 65%]' : '')+' (' + setup.ENGINE.formatWeight(lift*0.64)+')</ss>'), 'load':'slow', 'weight':(lift*0.77), 'bonus':'PHY', 'units': 0, },
'WORK STR' :{ 'lnk':( (settings.debugInfo ? '[STR+] ' : '')+ '<bb>MAX RESISTANCE </bb><ss>'+ (settings.debugInfo ? ' [1-2 reps @ 100%]' : '')+' (' + setup.ENGINE.formatWeight(lift*0.98)+')</ss>'), 'load':'max', 'weight':(lift*0.97), 'bonus':'STR', 'units': 0, },
'WORK INS' :{ 'lnk':( (settings.debugInfo ? '[INS+] ' : '')+ '<bb>PACE YOURSELF </bb><ss>'+ (settings.debugInfo ? ' [8-20 reps @ 75%]' : '')+' (' + setup.ENGINE.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 SPD' :{ 'lnk':( (settings.debugInfo ? '[SPD+] ' : '')+ '<bb>WORK HEAVY/FAST </bb><ss>'+ (settings.debugInfo ? ' [4-6 reps @ 85%]' : '')+' (' + setup.ENGINE.formatWeight(lift*0.84)+')</ss>'), 'load':'heavy', 'weight':(lift*0.84), 'bonus':'SPD', 'units': 0, },
'WORK END' :{ 'lnk':( (settings.debugInfo ? '[END+] ' : '')+ '<bb>BURNOUT/MAX REPS </bb><ss>'+ (settings.debugInfo ? ' [30+ reps @ 50%]' : '')+' (' + setup.ENGINE.formatWeight(lift*0.49)+')</ss>'), 'load':'light', 'weight':(lift*0.48), 'bonus':'END', 'units': 0, },
'WORK WSD' :{ 'lnk':( (settings.debugInfo ? '[WSD+] ' : '')+ '<bb>WARM UP/LIGHT TONE </bb><ss>'+ (settings.debugInfo ? ' [10 reps @ 25%]' : '')+' (' + setup.ENGINE.formatWeight(lift*0.24)+')</ss>'), 'load':'min', 'weight':(lift*0.24), 'bonus':'WSD', 'units':10, },
'WORK PHY' :{ 'lnk':( (settings.debugInfo ? '[PHY+] ' : '')+ '<bb>SLOW REPS/MAX FLEX </bb><ss>'+ (settings.debugInfo ? ' [6-12 reps @ 65%]' : '')+' (' + setup.ENGINE.formatWeight(lift*0.64)+')</ss>'), 'load':'slow', 'weight':(lift*0.77), 'bonus':'PHY', 'units': 0, },
'WORK STR' :{ 'lnk':( (settings.debugInfo ? '[STR+] ' : '')+ '<bb>GO FOR MAX LIFT </bb><ss>'+ (settings.debugInfo ? ' [1-2 reps @ 100%]' : '')+' (' + setup.ENGINE.formatWeight(lift*0.98)+')</ss>'), 'load':'max', 'weight':(lift*0.97), 'bonus':'STR', 'units': 0, },
'WORK INS' :{ 'lnk':( (settings.debugInfo ? '[INS+] ' : '')+ '<bb>PROPER TECHNIQUE </bb><ss>'+ (settings.debugInfo ? ' [8-20 reps @ 75%]' : '')+' (' + setup.ENGINE.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.ENGINE.reloadPassage(); >><</link>></li>";
});
} else {
out += " <li><bbbbb>(Area closed for renovation)</bbbbb></li>";
}
return "<ul class='workouts'>"+ out +"</ul>";
},
'gym_listWorkoutsForArea' : function(gym_area, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
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 = setup.ENGINE.canDoLift(workout, CHAR);
if(TEST.canDo) {
out += " <li><<link '"+ workout +"'>><<set _workout='"+ workout +"'>><<print setup.ENGINE.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_listMuscles_forWorkout' : function(workout) {
var out = '';
var val = 0;
var MUSCLES = setup.ENGINE.gym_getMuscles_forWorkout(workout);
MUSCLES.forEach(function(key) {
val = setup.ENGINE.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_listWorkouts_forMuscle' : function(muscle) {
var out = '';
var val = 0;
var WORKOUTS = setup.ENGINE.gym_getWorkouts_forMuscle(muscle);
WORKOUTS.forEach(function(key) {
val = setup.ENGINE.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>";
},
'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;
},
'hideSideBar' : function() {
$('#sidebar').hide(200);
$('#datetime').hide(200);
$('#feedback').hide(200);
},
'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_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;
},
'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 +'"';
},
'new_BODY' : function(min, max) {
var BODY={};
Object.keys(setup.BODY).forEach(function(key) {
BODY[key]={
'train' : setup.ENGINE.rand(min, max),
'damage' : setup.ENGINE.rand(min, max)-1,
'fatigue' : 0,
};
});
return BODY
},
'itemCard' : function(item_id) {
var ITEM = setup.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.toFixed(2) +"</span></div>
</div>
<div class='detail-pane'>
<div class='details'>
<span>Calories:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.kcal) +"</span>
<span>Protein:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.protein) +"g</span>
<span>Sugar:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.sugar) +"g</span>
"+(settings.lod_energyMatrix ? "
<span>regen:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.regen) +"</span>
<span>react:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.react) +"</span>
<span>metab:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.metab) +"</span>
<span>power:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.power) +"</span>
<span>fight:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.fight) +"</span>
<span>guard:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.guard) +"</span>
<span>vital:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.vital) +"</span>
<span>tough:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.tough) +"</span>
<span>force:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.force) +"</span>
<span>aware:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.aware) +"</span>
<span>train:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.train) +"</span>
<span>psych:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.psych) +"</span>
<span>vigor:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.vigor) +"</span>
<span>focus:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.focus) +"</span>
<span>skill:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.skill) +"</span>
" : '')+"
</div>
</div>
</div>
<div class='bottom_bar glass'>
<span class='link'>
<<link '[BUY]' >>
<<run setup.ENGINE.buyItem( '" + item_id + "');>>
<<replace '#feedback'>><<include 'FEEDBACK'>><</replace>>
<</link>>
</span>
<span class='link'>
<<link '[STEAL]'>>
<<run setup.ENGINE.stealItem('" + item_id + "');>>
<<replace '#feedback'>><<include 'FEEDBACK'>><</replace>>
<</link>>
</span>
</div>
</div>
";
},
'karmaAdd' : function(amt, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
var E = CHAR.MATRIX;
if(isNaN(E.light)) { E.light=0; }
if(isNaN(E.dark)) { E.dark=0; }
var lightBal = setup.ENGINE.getBalanceLight(CHAR);
var darkBal = setup.ENGINE.getBalanceDark(CHAR);
E.light += amt * lightBal;
E.dark += amt * darkBal;
},
'karmic_link' : function(stat, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
var kLink = '';
var cost = 0;
var type = '';
var label = stat;
var amt = 1;
var hint = '';
switch(stat) {
case 'STR':
case 'END':
case 'SPD':
case 'PHY':
case 'INS':
case 'WSD':
cost = Math.round(setup.ENGINE.xp_curve(
/* ( lv, +mod1, *rate1, ^exp, *rate2, +mod2) */
CHAR.STATS[stat], 1+0.00, 0.6, 2.4, 16, 0
));
type = 'STATS';
break;
case 'cup':
stat = 'bust';
case 'bust':
cost = Math.round(setup.ENGINE.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(setup.ENGINE.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(setup.ENGINE.xp_curve(
/* ( lv, +mod1, *rate1, ^exp, *rate2, +mod2) */
CHAR.METRICS[stat], 0, 1/42, 3, 6, 30
));
type = 'METRICS';
amt = 5;
hint = ("Metric"==settings.units ? '(2.27 kg)' : '');
break;
/* not a karmically linkable stat */
default:
return label;
}
/* not enough karma to link stat */
if(cost>setup.ENGINE.getTotalKarma(CHAR)) {
return "<span title='"+ cost +" karma'>" + label + "</span>";
}
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.ENGINE.show_as_menu('SPEND KARMA');>>";
kLink += "<</link>></span>";
return kLink;
},
'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;
},
'lbs2kg' : function(pounds) { return pounds/2.2; },
'levelAdd' : function(lv, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
var S = CHAR.STATS;
S.SPD += lv*(S.SPD/S.level);
S.END += lv*(S.END/S.level);
S.WSD += lv*(S.WSD/S.level);
S.PHY += lv*(S.PHY/S.level);
S.STR += lv*(S.STR/S.level);
S.INS += lv*(S.INS/S.level);
setup.ENGINE.qiFlow(0.034, 1, CHAR); setup.ENGINE.do_status_update(CHAR);
},
'lightAdd' : function(amt, CHAR) {
CHAR=CHAR||$GAMEDATA.PC; CHAR.MATRIX.light += amt; CHAR.MATRIX.dark += amt * -0.5;
},
'lightShift' : function(amt, CHAR) {
CHAR=CHAR||$GAMEDATA.PC; 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) {
CHAR=CHAR||$GAMEDATA.PC; setup.ENGINE.karmaAdd(-amt, CHAR); setup.ENGINE.lightShift(amt*3, CHAR);
},
'listConditions' : function(CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
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>";
},
'listMuscleStatus' : function(CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
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 cal = CHAR.STATS.caliber;
var trainVal = 0.0;
var dmgVal = 0.0; var dmgCal = 0.0; var condLv = '';
var ftgVal = 0.0; var ftgCal = 0.0; var dmgLv = '';
var condVal = 0.0; var condCal = 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); dmgCal = (trainVal-(dmgVal/cal));
ftgVal = (CHAR.BODY[part].fatigue||0); ftgCal = (trainVal-(ftgVal/cal));
condVal = (trainVal*cal)-dmgVal-ftgVal; condCal = condVal/cal; condPct = condVal/(cal*cal);
if(setup.BODY[part].type=='muscle') {
switch(true) {
case (condVal<0.0): condLv='failing'; break;
case (condVal<1.0): condLv='critical'; break;
case (condCal<1.0): condLv='low'; break;
default: condLv=''; break;
}
switch(true) {
case ((trainVal*cal-dmgVal)<0.0): dmgLv='failing'; break;
case ((trainVal*cal-dmgVal)<cal/2): dmgLv='critical'; break;
case (dmgCal<0.7): dmgLv='high'; break;
default: dmgLv=''; break;
}
switch(true) {
case ((trainVal*cal-ftgVal)<0.0): ftgLv='failing'; break;
case ((trainVal*cal-ftgVal)<cal/2): ftgLv='critical'; break;
case (ftgCal<0.7): ftgLv='high'; break;
default: ftgLv=''; break;
}
table += "<tr> <td style='width: 99%;'>"+ setup.ENGINE.powerMeter(trainVal, cal) +" </td> <td>"+setup.BODY[part].name+" </td> <td>"+(trainVal*cal).toFixed(1)+" </td> <td class='damage "+ dmgLv +"' title='"+ dmgLv +"'>"+dmgVal.toFixed(1)+" </td> <td class='fatigue "+ ftgLv +"' title='"+ ftgLv +"'>"+ftgVal.toFixed(1)+" </td> <td class='cond "+ condLv +"' title='"+ condLv +"'>"+(condVal).toFixed(1)+" </td> <td> / "+(setup.ENGINE.pow(cal, 2, '-')).toFixed(1)+" </td> </tr>";
}
});
return "<table class='workout'>"+ table +"</table>";
},
'listPowers' : function(CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
var cal = $GAMEDATA.PC.STATS.caliber;
return "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'>"+ setup.ENGINE.powerMeter(setup.ENGINE.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>";
},
'listSlaves' : function(CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
var slaves = '';
var SLAVE = null;
Object.keys(CHAR.SLAVES).forEach(function(slave) {
if(!CHAR.SLAVES[slave].figure) { CHAR.SLAVES[slave].figure=setup.ENGINE.char_metric('figure', CHAR.SLAVES[slave]); }
slaves += setup.ENGINE.slaveCard(slave);
});
return slaves;
},
'listStats' : function() {
return {
'SPD':'Speed',
'END':'Endurance',
'WSD':'Wisdom',
'PHY':'Physique',
'STR':'Strength',
'INS':'Instinct',
};
},
'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.debugInfo && 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;
}
},
'maxHours' : function(action_type, activity, level, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
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 { $GAMEDATA.ERRORS.NaN['act-'+resource]= ($GAMEDATA.ERRORS.NaN['act-'+resource]+1)||1; } catch(e) {} }
});
return hrs;
},
'maxResource' : function(res, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
var S = CHAR.STATS;
var maxRes = null;
switch(res) {
case 'regen': maxRes = (S.SPD * S.END); break;
case 'react': maxRes = (S.SPD * S.WSD); break;
case 'metab': maxRes = (S.SPD * S.PHY); break;
case 'power': maxRes = (S.SPD * S.STR); break;
case 'fight': maxRes = (S.SPD * S.INS); break;
case 'guard': maxRes = (S.END * S.WSD); break;
case 'vital': maxRes = (S.END * S.PHY); break;
case 'tough': maxRes = (S.END * S.STR); break;
case 'force': maxRes = (S.END * S.INS); break;
case 'aware': maxRes = (S.WSD * S.PHY); break;
case 'train': maxRes = (S.WSD * S.STR); break;
case 'psych': maxRes = (S.WSD * S.INS); break;
case 'vigor': maxRes = (S.PHY * S.STR); break;
case 'focus': maxRes = (S.PHY * S.INS); break;
case 'skill': maxRes = (S.STR * S.INS); break;
default: break;
}
return maxRes;
},
'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.ENGINE.wrap("<<link '"+ LIST[li][lnk] +"'>><<run setup.ENGINE.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.ENGINE.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.ENGINE.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.ENGINE.menuList(LIST, 'short', wrap, cls, ATTR ); },
'menuShow' : function(menu) {
return setup.ENGINE.show_as_menu(setup.MENU[menu].passage);
},
'passTime' : function(hours, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
var bodymass = setup.ENGINE.calcBodyMass(CHAR);
/* bleed off excess energy at normal rate 1x/hr */
setup.ENGINE.energyBleedOff(hours, null, CHAR);
/* PASSIVE REGEN */
setup.ENGINE.recoverPassive(hours, CHAR);
CHAR.MATRIX.kcal -= (bodymass*hours*0.15);
/* adjust weight */
setup.ENGINE.adjustWeight(hours, CHAR);
/* Adjust the clock */
setup.ENGINE.addMinutes(hours*60, CHAR.STATE.Date);
/* adjust the index... 0.1 point per year */
$GAMEDATA.WORLD.girlPower += hours/(24*365.25);
/* Update status again, as weight may have changed */
setup.ENGINE.do_status_update(CHAR);
},
'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.debugInfo && 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;
}
},
'powerMeter' : function(power, max) {
var out='<powermeter>';
var rem=0;
var graph_limit = 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).toFixed(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).toFixed(2); break;
}
if(i+0.5>s_max) {
out+="' style='opacity: 0.5;";
}
out+="'>"+(scaled ? s_unit : '')+"</seg>";
}
out+='</powermeter>';
return out;
},
'powerTransfer' : function(FROM_CHAR, TO_CHAR, amt, PARAM) {
amt=setup.ENGINE.putInBounds(amt, 'powerTransfer-amt');
PARAM=PARAM||{};
var STAT_LIST = setup.ENGINE.listStats();
amt = Math.min(0.34, amt+TO_CHAR.STATS.caliber/100);
var drain_amt = (setup.ENGINE.sqrt(1+amt, '0')-1);
var ht_amt = (settings.mac_heightGain ? (drain_amt*FROM_CHAR.METRICS.ht)+(amt/16) : 0);
$GAMEDATA.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(FROM_CHAR.STATS[stat]>1.01) {
TO_CHAR.STATS[stat] += Math.min(FROM_CHAR.STATS[stat], (FROM_CHAR.STATS[stat]) * (amt/3) * (FROM_CHAR.STATS[stat]/TO_CHAR.STATS[stat]));
FROM_CHAR.STATS[stat] -= drain_amt*FROM_CHAR.STATS[stat];
}
if(FROM_CHAR.STATS[stat]<0.99) {
FROM_CHAR.STATS[stat]=1;
}
});
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, TO_CHAR.STATS.caliber);
}
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'] && settings.mac_heightGain) {
TO_CHAR.METRICS.ht += ht_amt*(0.34+(FROM_CHAR.METRICS.adj_wt/TO_CHAR.METRICS.adj_wt)) /3;
FROM_CHAR.METRICS.ht -= ht_amt;
}
var fGen = FROM_CHAR.gender || FROM_CHAR.TRAITS.gender;
var tGen = TO_CHAR.gender || TO_CHAR.TRAITS.gender;
var beXfer = 0;
if( settings.mac_breastExpansion && (('female'==fGen)||('futa'==fGen)) && (('female'==tGen)||('futa'==tGen)) ) {
beXfer = Math.ceil(ht_amt*setup.ENGINE.rand(0.16, 0.34));
if((FROM_CHAR.METRICS.bust>-5)&&(FROM_CHAR.METRICS.cup>0)) {
FROM_CHAR.METRICS.bust -= beXfer; TO_CHAR.METRICS.bust += beXfer;
}
}
},
'prepMATRIX' : function(MATRIX) {
var newMATRIX = {};
var total = 0;
Object.keys(MATRIX).forEach(function(key) {
if(isNaN(MATRIX[key])) {
switch(MATRIX[key]) {
case '*':
newMATRIX[key] = setup.ENGINE.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':
/* 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 '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) {
CHAR=CHAR||$GAMEDATA.PC;
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) {
CHAR=CHAR||$GAMEDATA.PC;
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
);
CHAR.STATS.max_qi = (
setup.ENGINE.maxResource('regen', CHAR)
+ setup.ENGINE.maxResource('react', CHAR)
+ setup.ENGINE.maxResource('metab', CHAR)
+ setup.ENGINE.maxResource('power', CHAR)
+ setup.ENGINE.maxResource('fight', CHAR)
+ setup.ENGINE.maxResource('guard', CHAR)
+ setup.ENGINE.maxResource('vital', CHAR)
+ setup.ENGINE.maxResource('tough', CHAR)
+ setup.ENGINE.maxResource('force', CHAR)
+ setup.ENGINE.maxResource('aware', CHAR)
+ setup.ENGINE.maxResource('train', CHAR)
+ setup.ENGINE.maxResource('psych', CHAR)
+ setup.ENGINE.maxResource('vigor', CHAR)
+ setup.ENGINE.maxResource('focus', CHAR)
+ setup.ENGINE.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) {
CHAR=CHAR||$GAMEDATA.PC;
rate=rate||0.1;
cycles=cycles||3;
cycles=setup.ENGINE.putInBounds(cycles, 'qiFlow-cycles');
var gMul = ('she'==setup.ENGINE.he_she(CHAR.TRAITS.gender||CHAR.gender) ? CHAR.STATS.caliber : setup.ENGINE.sqrt(CHAR.STATS.caliber, '-') ) /69;
var E = {};
var S = CHAR.STATS;
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.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.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.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.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.fight += -(E.fight*rate) +( (E.psych + E.force + E.power + E.metab) /4 *rate ) +Math.abs((S.SPD+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.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.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.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.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.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.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.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.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.skill += -(E.skill*rate) +( (E.tough + E.vigor + E.fight + E.psych) /4 *rate ) +Math.abs((S.STR+S.INS)*S.caliber*rate*gMul);
} else {
/* decay */
setup.ENGINE.qiAdd(-fade*Math.random(), CHAR);
/* cosmetic only, cap qi at zero until recovery */
CHAR.MATRIX.qi = Math.min(0, CHAR.MATRIX.qi);
}
/* setup.ENGINE.debugLog(JSON.stringify(CHAR.MATRIX)); */
setup.ENGINE.energyBleedOff(1, null, CHAR);
E=null;
}
},
'rand' : 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);
},
'randomID' : function(gender, PARAM) {
/* will add age, address, and other bits later... */
gender=gender||either('male','female');
PARAM=PARAM||{};
var amazonIndex = PARAM['amazonIndex'] || $GAMEDATA.WORLD.amazonIndex;
var azI_Ht = 0;
var LICENSE = {
'name' : setup.NAMES.randomName(gender),
'age' : setup.NAMES.randomAge(),
'gender' : gender,
'cardtype' : either('ID','License','License','License'),
};
switch(true) {
case (gender=='female'): case (gender=='futa'):
if(settings.mac_heightGain) { azI_Ht = amazonIndex; }
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+((setup.NAMES.randomHeight( LICENSE.gender=='female' ? 64 : 69 ))+3-Math.round(setup.ENGINE.sqrt(40-LICENSE.age,'+')) * 1.1);
LICENSE.wt = 15+(setup.NAMES.randomWeight(125+setup.ENGINE.sqrt(LICENSE.age,'0'), 250+LICENSE.age)*( LICENSE.gender=='male' ? 1.1 : 0.9 )) * 1.1;
LICENSE.base_ht = 63;
LICENSE.scale = (LICENSE.ht / LICENSE.base_ht);
LICENSE.adj_wt = setup.ENGINE.scaleWeight(LICENSE.wt, LICENSE.scale);
LICENSE.bust = (gender=='male' ? -3 : setup.NAMES.randomBust()+1 );
return LICENSE;
},
'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) {
CHAR=CHAR||$GAMEDATA.PC;
hours=setup.ENGINE.putInBounds(hours, 'recoverActive-hours');
var gMul = ('she'==setup.ENGINE.he_she(CHAR.TRAITS.gender||CHAR.gender) ? CHAR.STATS.caliber : 1 ) /5;
var preCalc = (hours*gMul/6);
var S = CHAR.STATS;
var E = CHAR.MATRIX;
/* ACTIVE REGEN */
E.regen += (S.SPD + S.END)*(preCalc*7.0);
E.react += (S.SPD + S.WSD)*(preCalc*5.0);
E.metab += (S.SPD + S.PHY)*(preCalc*0.3);
E.power += (S.SPD + S.STR)*(preCalc*1.0);
E.fight += (S.SPD + S.INS)*(preCalc*5.0);
E.guard += (S.END + S.WSD)*(preCalc*3.0);
E.vital += (S.END + S.PHY)*(preCalc*3.0);
E.tough += (S.END + S.STR)*(preCalc*1.0);
E.force += (S.END + S.INS)*(preCalc*3.0);
E.aware -= (S.WSD + S.PHY)*(preCalc*5.0);
E.train += (S.WSD + S.STR)*(preCalc*3.0);
E.psych += (S.WSD + S.INS)*(preCalc*5.0);
E.vigor += (S.PHY + S.STR)*(preCalc*3.0);
E.focus += (S.PHY + S.INS)*(preCalc*5.0);
E.skill += (S.STR + S.INS)*(preCalc*3.0);
/* METABOLC BONUS FROM FOOD */
E.vital += setup.ENGINE.sqrt(E.regen, '-')*hours; E.tough += setup.ENGINE.sqrt(E.regen/2, '-')*hours;
E.vigor += setup.ENGINE.sqrt(E.metab, '-')*hours; E.power += setup.ENGINE.sqrt(E.metab/2, '-')*hours;
setup.ENGINE.regenerateBody(hours/48, hours, CHAR);
setup.ENGINE.qiFlow(0.3, hours, CHAR);
},
'recoverPassive' : function(hours, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
hours=setup.ENGINE.putInBounds(hours, 'recoverPassive-hours');
var gMul = ('she'==setup.ENGINE.he_she(CHAR.TRAITS.gender||CHAR.gender) ? CHAR.STATS.caliber : 1 ) /3;
var preCalc = (hours*gMul/6);
var S = CHAR.STATS;
var E = CHAR.MATRIX;
/* PASSIVE REGEN */
E.regen += (S.SPD + S.END)*preCalc;
E.react += (S.SPD + S.WSD)*preCalc;
E.metab += (S.SPD + S.PHY)*preCalc;
E.power += (S.SPD + S.STR)*preCalc;
E.fight += (S.SPD + S.INS)*preCalc;
E.guard += (S.END + S.WSD)*preCalc;
E.vital += (S.END + S.PHY)*preCalc;
E.tough += (S.END + S.STR)*preCalc;
E.force += (S.END + S.INS)*preCalc;
E.aware += (S.WSD + S.PHY)*preCalc;
E.train += (S.WSD + S.STR)*preCalc;
E.psych += (S.WSD + S.INS)*preCalc;
E.vigor += (S.PHY + S.STR)*preCalc;
E.focus += (S.PHY + S.INS)*preCalc;
E.skill += (S.STR + S.INS)*preCalc;
/* METABOLC BONUS FROM FOOD */
E.vital += setup.ENGINE.sqrt(E.regen, '-')*hours; E.tough += setup.ENGINE.sqrt(E.regen/2, '-')*hours;
E.vigor += setup.ENGINE.sqrt(E.metab, '-')*hours; E.power += setup.ENGINE.sqrt(E.metab/2, '-')*hours;
setup.ENGINE.regenerateBody(hours/360, hours/3, CHAR);
setup.ENGINE.qiFlow(0.1, hours/3, CHAR);
},
'refresh_detail' : function() {
if($GAMEDATA.PC.STATE.detail) {
$('#detail').html('');
$('#detail').wiki(Story.get($GAMEDATA.PC.STATE.detail).processText());
}
},
'refresh_fighter_info' : function(F_CHAR) {
F_CHAR.age = setup.ENGINE.val('age' , F_CHAR);
F_CHAR.gender = setup.ENGINE.val('gender' , F_CHAR);
F_CHAR.ht = setup.ENGINE.formatHeight(F_CHAR.METRICS.ht);
F_CHAR.wt = setup.ENGINE.formatWeight(F_CHAR.METRICS.adj_wt);
F_CHAR.str = setup.ENGINE.statPrint('STR', F_CHAR);
F_CHAR.end = setup.ENGINE.statPrint('END', F_CHAR);
F_CHAR.spd = setup.ENGINE.statPrint('SPD', F_CHAR);
F_CHAR.phy = setup.ENGINE.statPrint('PHY', F_CHAR);
F_CHAR.ins = setup.ENGINE.statPrint('INS', F_CHAR);
F_CHAR.wsd = setup.ENGINE.statPrint('WSD', F_CHAR);
F_CHAR.level = (F_CHAR.STATS.level).toFixed(0);
F_CHAR.caliber = (F_CHAR.STATS.caliber).toFixed(0);
F_CHAR.tone = setup.ENGINE.char_metric('bodytone', F_CHAR);
F_CHAR.fat = setup.ENGINE.char_metric('bodyfat', F_CHAR);
F_CHAR.bicep = setup.ENGINE.char_metric('bicep', F_CHAR);
F_CHAR.quads = setup.ENGINE.char_metric('quads', F_CHAR);
F_CHAR.figure = setup.ENGINE.char_metric('figure', F_CHAR);
},
'regenerateBody' : function(units, hours, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
units=units||0.0001;
var cal = (CHAR.STATS.caliber||3);
var gMul = ('she'==setup.ENGINE.he_she(CHAR.TRAITS.gender||CHAR.gender) ? cal : 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 = setup.ENGINE.pow((CHAR.MATRIX.regen||25), 1/3, '-');
var cProtein = 0; var uProtein = 0;
var train = 1; var damage = 0; var fatigue = 0; var cond = 1;
var wt = CHAR.METRICS.wt||100;
var phyRt = setup.ENGINE.sqrt(CHAR.STATS.PHY, '-');
/* I had better not see another fucking NaN! */
Object.keys(CHAR.BODY).forEach(function(part) {
train = (CHAR.BODY[part].train||0);
damage = (CHAR.BODY[part].damage||0);
fatigue = (CHAR.BODY[part].fatigue||0);
base = damage + ( train * cal)+regen;
cProtein = (CHAR.MATRIX.protein||0);
uProtein = Math.min(cProtein+wt, base);
CHAR.MATRIX.protein = cProtein -Math.ceil(uProtein/30);
amt = Math.min( damage, units*(1 + setup.ENGINE.sqrt(3*(base+uProtein), '-')/100) )*gMul;
/* no more negative damage... entropy will be its own variable */
damage = Math.max(damage -amt, 0);
fatigue = fatigue -((12+cal+phyRt)*hours/72);
train = Math.min( (train + (amt/cal)), (cal) );
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 * cal -damage -fatigue;
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;
}
});
var max = setup.ENGINE.pow(cal, 2, '-');
LIMBS.ARMS.avg = Math.round( ( LIMBS.ARMS.min+ (LIMBS.ARMS.total/LIMBS.ARMS.parts) )/2 ); LIMBS.ARMS.pct = LIMBS.ARMS.avg /max;
LIMBS.ARML.avg = Math.round( ( LIMBS.ARML.min+ (LIMBS.ARML.total/LIMBS.ARML.parts) )/2 ); LIMBS.ARML.pct = LIMBS.ARML.avg /max;
LIMBS.ARMR.avg = Math.round( ( LIMBS.ARMR.min+ (LIMBS.ARMR.total/LIMBS.ARMR.parts) )/2 ); LIMBS.ARMR.pct = LIMBS.ARMR.avg /max;
LIMBS.LEGS.avg = Math.round( ( LIMBS.LEGS.min+ (LIMBS.LEGS.total/LIMBS.LEGS.parts) )/2 ); LIMBS.LEGS.pct = LIMBS.LEGS.avg /max;
LIMBS.LEGL.avg = Math.round( ( LIMBS.LEGL.min+ (LIMBS.LEGL.total/LIMBS.LEGL.parts) )/2 ); LIMBS.LEGL.pct = LIMBS.LEGL.avg /max;
LIMBS.LEGR.avg = Math.round( ( LIMBS.LEGR.min+ (LIMBS.LEGR.total/LIMBS.LEGR.parts) )/2 ); LIMBS.LEGR.pct = LIMBS.LEGR.avg /max;
LIMBS.CORE.avg = Math.round( ( LIMBS.CORE.min+ (LIMBS.CORE.total/LIMBS.CORE.parts) )/2 ); LIMBS.CORE.pct = LIMBS.CORE.avg /max;
LIMBS.SEXX.avg = Math.round( ( 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) {
CHAR=CHAR||$GAMEDATA.PC;
var slot_id = setup.ENGINE.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;
}
},
'reloadPassage' : function() {
return "<<replace '#passages'>><<include '"+ State.passage +"'>><</replace>>";
},
'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();
}
},
'round2frac' : function(val, frac) {
return Math.round(val * frac)/frac;
},
'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>";
},
'sale_price' : function(cost, discount) {
return cost*(1-discount);
},
'scale' : function(base, dimensions, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
var bio_scale = setup.ENGINE.pow( 1.75, setup.ENGINE.logX(2, CHAR.METRICS.scale, '-') );
var scaled = base * (setup.ENGINE.pow(bio_scale, dimensions, '-'));
return (isFinite(scaled) ? scaled : 0.001);
},
'scaleWeight' : function(base, scale) {
return (base * (setup.ENGINE.pow(scale, 3, '-')));
},
'secondChance' : function(CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
var out = '';
var how = null;
State.setVar( '_CHAR', CHAR );
switch(true) {
case ((CHAR.X.timeShards) && (CHAR.X.timeShards>0)): how='timeshard'; break;
default: break;
}
if(how) {
out = "<<link 'I'M NOT DONE YET!'>><<run setup.ENGINE.secondWind('"+ how +"', _CHAR); >><<goto 'GO HOME'>><</link>>";
}
return out;
},
'secondWind' : function(how, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
switch(how) {
case 'timeshard': CHAR.X.timeShards--; setup.ENGINE.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;
setup.ENGINE.qiAdd(setup.ENGINE.pow(CHAR.STATS.level, 2, '-')*15);
if(CHAR.METRICS.wt<CHAR.METRICS.base_ht) { CHAR.METRICS.wt = (CHAR.METRICS.base_ht*2)+CHAR.STATS.caliber; }
CHAR.MATRIX.light=CHAR.STATS.karmic_well*CHAR.STATS.caliber;
CHAR.MATRIX.dark=CHAR.STATS.karmic_well*CHAR.STATS.caliber;
},
'select_char' : function(char_name) {
$GAMEDATA.PC = setup.CHARS[char_name];
setup.ENGINE.do_status_update($GAMEDATA.PC);
if(!$GAMEDATA.PC.STATE) {
$GAMEDATA.PC.STATE ={
'saveVersion' : setup.ENGINE.engineVersion,
'feedbackQueue' : [],
'Date' : new Date(),
'lastPassage' : null,
'lastExercise' : null,
'lastActivity' : null,
'lastAction' : null,
'lastItem' : null,
};
}
},
'setTime' : function(h, n, s, dateObj) { dateObj=dateObj||$GAMEDATA.PC.STATE.Date; n=n||0; s=s||0; dateObj.setHours(h, n, s); },
'setupPassage' : function(passage) {
passage=passage||State.passage;
setup.ENGINE.do_status_update($GAMEDATA.PC);
/* run passage setup */
setup.PASSAGES[passage].setup();
var encounter = setup.ENGINE.spinTheWheel(setup.PASSAGES[passage].ENCOUNTERS);
State.setVar( '_encounter', encounter );
/* IF event has variations, update _encounter to a specific one */
if(setup.ENCOUNTERS[_encounter].VARIATIONS) {
var sub_encounter = setup.ENGINE.spinTheWheel(setup.ENCOUNTERS[_encounter].VARIATIONS);
State.setVar( '_encounter', sub_encounter );
}
/* run encounter setup */
setup.ENCOUNTERS[encounter].setup();
if(setup.ENCOUNTERS[encounter].hideMenu || setup.ENCOUNTERS[encounter].replace) {
setup.ENGINE.hideSideBar();
}
return null;
},
'show_as_menu' : function(passage) {
$('#menu').html('');
$('#menu').wiki(Story.get(passage).processText());
$('#menu').show();
},
'showSideBar' : function() {
$('#sidebar').show(200);
$('#datetime').show(200);
$('#feedback').show(200);
},
'slaveCard' : function(slave_id, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
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'>"+
setup.ENGINE.slaveDetails(slave_id, CHAR)
+"</div>
</div>
</div>
<div class='bottom_bar glass'>
<span class='link'>
<<link '[INTERACT WITH]' >>
<<set _slave='"+ slave_id +"';>>
<<run setup.ENGINE.menuShow('slaves'); >>
<</link>>
</span>
</div>
</div>
";
},
'slaveDetails' : function(slave_id, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; }
var SLAVE = CHAR.SLAVES[slave_id];
var S = SLAVE.STATS;
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: "+ SLAVE.age +" </span>
<span>Gender: "+ SLAVE.gender +" </span>
<span>Caught: "+ setup.ENGINE.getLongDate(SLAVE.captured) +" </span>
<span>Height: "+ setup.ENGINE.formatHeight(SLAVE.METRICS.ht) +" </span>
<span>Weight: "+ setup.ENGINE.formatWeight(SLAVE.METRICS.adj_wt) +" </span>
<span>figure: "+ setup.ENGINE.char_metric('figure', SLAVE) +" </span>
<span>Calories: "+ E.kcal.toFixed(0) +" </span>
<span>Protein: "+ E.protein.toFixed(0) +"g</span>
<span>Sugar: "+ E.sugar.toFixed(0) +"g</span>
<span>fat: "+ setup.ENGINE.char_metric('bodyfat', SLAVE) +" </span>
<span>muscle: "+ setup.ENGINE.char_metric('bodytone', SLAVE) +" </span>
<span>level: "+ S.level.toFixed(0) +" . . . caliber: "+ S.caliber.toFixed(0) +" </span>
<span>bicep: "+ setup.ENGINE.char_metric('bicep', SLAVE) +" </span>
<span>quads: "+ setup.ENGINE.char_metric('quads', SLAVE) +" </span>
<span>Qi: "+ E.qi.toFixed(0) +" / "+ SLAVE.STATS.max_qi.toFixed(0) +" </span>
<span>SPD: "+ setup.ENGINE.statPrint('SPD', SLAVE) +" </span>
<span>WSD: "+ setup.ENGINE.statPrint('WSD', SLAVE) +" </span>
<span>STR: "+ setup.ENGINE.statPrint('STR', SLAVE) +" </span>
<span>PHY: "+ setup.ENGINE.statPrint('PHY', SLAVE) +" </span>
<span>INS: "+ setup.ENGINE.statPrint('INS', SLAVE) +" </span>
<span>END: "+ setup.ENGINE.statPrint('END', SLAVE) +" </span>
</div>
<div>"+ setup.ENGINE.listConditions(SLAVE) +"</div>
";
},
'slaveDispose' : function(slave_id, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; }
delete CHAR.SLAVES[slave_id];
_slave=null;
return 'Gone.';
},
'slaveDress' : function(slave_id, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; }
return 'Dress Slave... not yet implemented'
+(settings.debugInfo ? " <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'>>"; */
},
'slaveDrain' : function(slave_id, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; }
if(CHAR.SLAVES[slave_id].dead) { return 'Nothing left to take, '+ CHAR.SLAVES[slave_id].name +'is dead.'; }
if(CHAR.MATRIX.dark>=(CHAR.STATS.caliber*CHAR.STATS.level)) { return 'not enough dark energy to feed...'; }
var pct = setup.ENGINE.combatDrain(CHAR, CHAR.SLAVES[slave_id], 'beta');
setup.ENGINE.slaveRefreshCard(slave_id, CHAR);
return ('You drain '+ (pct*100).toFixed(0) +'% from '+ CHAR.SLAVES[slave_id].name +', and watch '+ setup.ENGINE.him_her(CHAR.SLAVES[slave_id].gender) +' shrivel as you grow.');
},
'slaveExamine' : function(slave_id, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; }
return "Examine Slave... not yet implemented"
+(settings.debugInfo ? " <small><br />(expected to be added when the desctiption system is reworked in Engine v0.26)</small>" : '');
/* return "<<include 'SELF'>>"; */
},
'slaveFeed' : function(slave_id, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
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) {
CHAR=CHAR||$GAMEDATA.PC;
if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; }
setup.ENGINE.regenerateBody(0.0001, 0.0001, CHAR.SLAVES[slave_id]);
State.setVar( '_P2', CHAR.SLAVES[slave_id] );
setup.ENGINE.hideSideBar();
setup.ENCOUNTERS.combat.setup();
setup.ENGINE.menuHide();
return "<<replace '#passages'>><<include 'COMBAT UI'>><</replace>>";
},
'slaveFree' : function(slave_id, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; }
var WORLD=$GAMEDATA.WORLD;
var SLAVE = CHAR.SLAVES[slave_id];
SLAVE.released = new Date;
SLAVE.kidnapped = false;
var them = setup.ENGINE.him_her(SLAVE.gender);
var they = setup.ENGINE.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) {
CHAR=CHAR||$GAMEDATA.PC;
if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; }
var SLAVE=CHAR.SLAVES[slave_id];
var out='';
setup.ENGINE.combatHeal(CHAR, SLAVE, 'beta');
out += " Tapping into the Primal Flow, you channel your focus to heal "+ SLAVE.name_first +", and watch as "+ setup.ENGINE.his_her(SLAVE.gender) + " wounds begin to close...";
if(Math.random()<(setup.ENGINE.sqrt(CHAR.STATS.caliber, '+')*setup.ENGINE.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 += setup.ENGINE.wildSurge(CHAR, SLAVE);
} else if(SLAVE.dead && (setup.ENGINE.charTempVar(SLAVE, 'newQi')>(SLAVE.STATS.max_qi/3))) {
setup.ENGINE.combatRevive(CHAR, SLAVE, 'beta');
setup.ENGINE.lightAdd(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;
out += " The energies coursing through "+ setup.ENGINE.his_her(SLAVE.gender) + " body were strong enough to get "+ setup.ENGINE.him_her(SLAVE.gender) + " back on "+ setup.ENGINE.his_her(SLAVE.gender) + " feet...";
}
if(CHAR.MATRIX.qi<1) {
/* pass out... */
setup.ENGINE.giveFeedback('You overexerted yourself trying to heal '+ SLAVE.name_first +'...');
setup.ENGINE.menuHide();
out += "<<goto 'GO HOME'>>";
}
setup.ENGINE.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) {
CHAR=CHAR||$GAMEDATA.PC;
if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; }
var SLAVE = CHAR.SLAVES[slave_id];
var THEM = setup.ENGINE.him_her(SLAVE.gender).toUpperCase();
var THEIR = setup.ENGINE.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'>"+
setup.ENGINE.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.ENGINE.slaveMuscle('" + slave_id + "', _CHAR );>><</replace>><</link>></span>
<span class='link disabled' ><<link 'EXAMINE _THEM' >><<replace '#slave_desc'>><<print setup.ENGINE.slaveExamine('" + slave_id + "', _CHAR );>><</replace>><</link>></span>
<span class='link' ><<link 'FEED _THEM' >><<replace '#slave_desc'>><<print setup.ENGINE.slaveFeed('" + slave_id + "', _CHAR );>><</replace>><</link>></span>
<span class='link disabled' ><<link 'DRESS _THEM' >><<replace '#slave_desc'>><<print setup.ENGINE.slaveDress('" + slave_id + "', _CHAR );>><</replace>><</link>></span>
<span class='link disabled' ><<link 'TALK TO _THEM' >><<replace '#slave_desc'>><<print setup.ENGINE.slaveTalk('" + slave_id + "', _CHAR );>><</replace>><</link>></span>
<span class='link' ><<link 'FIGHT _THEM' >><<replace '#slave_desc'>><<print setup.ENGINE.slaveFight('" + slave_id + "', _CHAR );>><</replace>><</link>></span>
<span class='link disabled' ><<link 'USE _THEM' >><<replace '#slave_desc'>><<print setup.ENGINE.slaveUse('" + slave_id + "', _CHAR );>><</replace>><</link>></span>
<span class='link disabled' ><<link 'PUNISH _THEM' >><<replace '#slave_desc'>><<print setup.ENGINE.slavePunish('" + slave_id + "', _CHAR );>><</replace>><</link>></span>
<span class='link' ><<link 'HEAL _THEM' >><<replace '#slave_desc'>><<print setup.ENGINE.slaveHeal('" + slave_id + "', _CHAR );>><</replace>><</link>></span>
<span class='link' ><<link 'DRAIN _THEM' >><<replace '#slave_desc'>><<print setup.ENGINE.slaveDrain('" + slave_id + "', _CHAR );>><</replace>><</link>></span>
<span class='link disabled' ><<link 'TRAIN _THEM' >><<replace '#slave_desc'>><<print setup.ENGINE.slaveTrain('" + slave_id + "', _CHAR );>><</replace>><</link>></span>
<span class='link' ><<link 'RENAME _THEM' >><<replace '#slave_desc'>><<print setup.ENGINE.slaveRename('" + slave_id + "', _CHAR );>><</replace>><</link>></span>
<span class='link disabled' ><<link 'PLAY AS _THEM' >><<replace '#slave_desc'>><<print setup.ENGINE.slavePlayAs('" + slave_id + "', _CHAR );>><</replace>><</link>></span>
" +( SLAVE.dead ? "
<span class='link' ><<link 'DISPOSE OF BODY' >><<replace '#slave_desc'>><<print setup.ENGINE.slaveDispose('" + slave_id + "', _CHAR );>><</replace>><</link>></span>
" : "
<span class='link' ><<link 'SET _THEM FREE' >><<replace '#slave_desc'>><<print setup.ENGINE.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) {
CHAR=CHAR||$GAMEDATA.PC;
if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; }
return setup.ENGINE.listMuscleStatus(CHAR.SLAVES[slave_id]);
},
'slavePlayAs' : function(slave_id, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; }
return 'Play As... not yet implemented'
+(settings.debugInfo ? " <small><br />(expected to be added when character-switching is added... sometime before Engine v0.55)</small>" : '');
},
'slavePunish' : function(slave_id, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; }
return 'Punish Slave... not yet implemented'
+(settings.debugInfo ? " <small><br />(expected to be added with adult interactions ... in Engine v0.8)</small>" : '');
},
'slaveRefreshCard' : function(slave_id, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; }
$('#slave_detail').html('');
$('#slave_detail').wiki(setup.ENGINE.slaveDetails(slave_id, CHAR));
},
'slaveRename' : function(slave_id, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
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) {
CHAR=CHAR||$GAMEDATA.PC;
if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; }
return ('Talk to Slave... not yet implemented')
+(settings.debugInfo ? " <small><br />(expected to be added with relationsips/biases ... in Engine v0.7)</small>" : '');
},
'slaveTrain' : function(slave_id, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; }
return 'Train Slave... not yet implemented'
+(settings.debugInfo ? " <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) {
CHAR=CHAR||$GAMEDATA.PC;
if(!CHAR.SLAVES[slave_id]) { return slave_id +' isn't here...'; }
return 'Use Slave... not yet implemented'
+(settings.debugInfo ? " <small><br />(expected to be added with adult interactions ... in Engine v0.8)</small>" : '');
},
'spinTheWheel' : function(ODDS) {
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=setup.ENGINE.getDynamic(ODDS[name]);
if(wedge>0) {
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; })];
},
'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.debugInfo && console && console.trace) { console.trace(); }
throw "it ain't yer imagination, you tried to root a negative!";
break;
}
} else {
return root;
}
},
'stack' : function(n) { return (n+1)*(n)/2; },
/* TODO: rework stats to include modifier arrays... */
'statAdd' : function(stat, val, CHAR) {
/* replace later with code that adds to the base */
CHAR.STATS[stat] += val;
},
'statGet' : function(stat, CHAR) {},
'statPrint' : function(stat, CHAR, PARAMS) {
PARAMS=PARAMS||{};
CHAR=CHAR||$GAMEDATA.PC;
var PARTS = CHAR.STATS[stat].toFixed(3).split('.');
return "<span class='statval "+stat+"'><span class='major'>"+ PARTS[0] +"</span><span class='minor'>."+ PARTS[1] +"</span></span>";
},
'statSet' : function(stat, val, CHAR) {},
'stealItem' : function(item_id, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
$GAMEDATA.PC.STATE.lastAction = 'steal';
var ITEM = setup.ENGINE.getItem(item_id);
var success=null;
if((CHAR.MATRIX.light>CHAR.MATRIX.dark) && (CHAR.MATRIX.light>ITEM.cost)) {
setup.ENGINE.lightAdd(-ITEM.cost, CHAR);
setup.ENGINE.giveFeedback('You took [' + ITEM.name + '] ...luckily nobody saw you.');
success=true;
} else if(CHAR.MATRIX.dark>(ITEM.cost/2)) {
setup.ENGINE.karmaAdd(-ITEM.cost/2, CHAR);
setup.ENGINE.giveFeedback('You snagged [' + ITEM.name + '] ...that was almost too easy.');
success=true;
} else {
setup.ENGINE.giveFeedback('you got caught, this is really bad... where will you go if you are banned?');
success=false;
}
if(success) { setup.ENGINE.addItem(item_id); }
setup.ENGINE.do_status_update(CHAR);
return success;
},
'takeHome' : function(WHO, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
WHO.captured = new Date;
var WORLD=$GAMEDATA.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) {
CHAR=CHAR||$GAMEDATA.PC;
effort=setup.ENGINE.putInBounds(effort||1.0, 'trainSTATS-effort');
var cost = 34000/CHAR.STATS.caliber;
var S = CHAR.STATS;
/* WORKOUT UNIQUE CODE: STR(END) END(SPD) SPD(PHY) PHY(INS) WSD(INS) STAT INCREASE FOR EFFORT */
S.SPD += ( -( (act.power||0) + (act.regen||0) + (act.metab||0) + (act.fight||0) + (act.react||0) )*effort /(cost*S.SPD));
S.END += ( -( (act.tough||0) + (act.regen||0) + (act.vital||0) + (act.force||0) + (act.guard||0) )*effort /(cost*S.END));
S.WSD += ( -( (act.train||0) + (act.guard||0) + (act.react||0) + (act.aware||0) + (act.psych||0) )*effort /(cost*S.WSD));
S.PHY += ( -( (act.vigor||0) + (act.vital||0) + (act.metab||0) + (act.focus||0) + (act.aware||0) )*effort /(cost*S.PHY));
S.STR += ( -( (act.tough||0) + (act.power||0) + (act.vigor||0) + (act.skill||0) + (act.train||0) )*effort /(cost*S.STR));
S.INS += ( -( (act.skill||0) + (act.force||0) + (act.fight||0) + (act.focus||0) + (act.psych||0) )*effort /(cost*S.INS));
},
'trim_combatLog' : function() {
var cutoff=settings.perf_combatLog||30;
$('#combat_log .btl_evt:nth-of-type(n+'+ cutoff +')').remove();
},
'updateConditions' : function(CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
Object.keys(setup.STATUSES).forEach(function(cond) {
setup.STATUSES[cond](CHAR);
});
},
'useItem' : function(item_id, qty, OWNER, TARGET) {
OWNER=OWNER||$GAMEDATA.PC;
qty=setup.ENGINE.putInBounds(qty||1, 'useItem-qty'); /* option to multi-use */
$GAMEDATA.PC.STATE.lastAction = 'use';
$GAMEDATA.PC.STATE.lastItem = item_id;
/* do you even have one, bro? */
if(!OWNER.STUFF[item_id]) { return false; }
if(('all'==qty)||('*'==qty)) { qty=OWNER.STUFF[item_id]; }
setup.ENGINE.before_use(item_id, qty, OWNER);
OWNER.STUFF[item_id]-=qty;
var ITEM = setup.ENGINE.getItem(item_id);
/* if the shoe fits, wear it... */
var iType = setup.ROLES.ALL[ITEM.role].type;
switch(iType) {
/* if not, try eating it */
case 'wearable':
setup.ENGINE.equipItem(item_id, TARGET);
break;
case 'consumable':
var iMAT = ITEM.MATRIX;
setup.ENGINE.doEnergyMATRIX(iMAT, qty, TARGET);
setup.ENGINE.regenerateBody(0.01, qty/10, TARGET);
break;
default:
/* or just put it on the mantle to look at */
}
/* Adjust the clock */
setup.ENGINE.addSeconds(10 * qty / OWNER.STATS.SPD);
/* load item MATRIX */
/* setup.ENGINE.doEnergyMATRIX(MATRIX, units); */
setup.ENGINE.after_use(item_id, qty, OWNER);
/* clean up inventory */
if(OWNER.STUFF[item_id]<1) { setup.ENGINE.delItem(item_id); }
return true;
},
'unstack' : function(n) { return (setup.ENGINE.sqrt((8*n)+1, '-')-1)/2; },
'update_bodysize' : function(CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
/* 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 VBM = setup.ENGINE.scale(CHAR.METRICS.wt-CHAR.METRICS.ht, 3, CHAR);
var PHY_stack = (CHAR.STATS.PHY+1)*(CHAR.STATS.PHY/2);
var VBM_toned = PHY_stack/(PHY_stack+VBM);
CHAR.METRICS.scale = CHAR.METRICS.ht / CHAR.METRICS.base_ht;
CHAR.METRICS.adj_wt = Math.max( Math.round(setup.ENGINE.scale(CHAR.METRICS.wt, 3, CHAR)), 0.1);
CHAR.METRICS.BMI = (CHAR.METRICS.adj_wt/(setup.ENGINE.pow(CHAR.METRICS.ht, 2, '-'))*703);
CHAR.METRICS.bodyfat = Math.min( (1-VBM_toned)*(VBM/CHAR.METRICS.adj_wt)*100, 100 );
CHAR.METRICS.bodytone = Math.min( ( VBM_toned )*(VBM/CHAR.METRICS.adj_wt)*100, 100 );
/* base calculations */
CHAR.METRICS.bicep = setup.ENGINE.calcMetric('bicep', CHAR);
CHAR.METRICS.quads = setup.ENGINE.calcMetric('quads', CHAR);
CHAR.METRICS.chest = setup.ENGINE.calcMetric('chest', CHAR);
CHAR.METRICS.waist = setup.ENGINE.calcMetric('waist', CHAR);
CHAR.METRICS.hips = setup.ENGINE.calcMetric('hips', CHAR);
CHAR.METRICS.cup = Math.round( setup.ENGINE.calcMetric('cup', CHAR));
},
'update_slaves' : function(CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
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) {
CHAR=CHAR||$GAMEDATA.PC;
var WORLD=$GAMEDATA.WORLD;
var thisUpdate = CHAR.STATE.Date.getTime();
var hoursPassed = (thisUpdate - (CHAR.lastUpdate || thisUpdate)) / (60*60*1000);
WORLD.girlPower = Math.max(0.1, WORLD.girlPower);
WORLD.amazonIndex=WORLD.girlPower/10;
setup.ENGINE.update_slaves(CHAR);
CHAR.lastUpdate = thisUpdate;
},
'val' : function(metric, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
/* first try char_metric() */
var val = setup.ENGINE.char_metric(metric, CHAR);
if(!val) {
/* next check TRAITS */
val=CHAR.TRAITS[metric];
}
if(!val) {
/* next check STATS */
val=CHAR.STATS[metric];
}
if(!val) {
/* lastly, put place-holder */
val = setup.ENGINE.valMissing(metric);
}
return val;
},
'valMissing' : function(what) {
return "<span class='blank'>[insert '"+ what +"' metric here...]</span>";
},
'wildSurge_boost' : function(CASTER, TARGET, amt) {
amt=setup.ENGINE.putInBounds(amt, 'wildSurge_boost-amt');
var out = '';
var you = (TARGET.name==$GAMEDATA.PC.name);
var ht_plus1 = 0;
var ht_plus2 = 0;
var regrow = 0;
var gain = 0;
var expectedTargetQi = TARGET.MATRIX.qi;
var qiAdd = CASTER.STATS.max_qi*3;
var qiAddFD = CASTER.STATS.max_qi*CASTER.STATS.caliber;
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... */
setup.ENGINE.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>=TARGET.STATS.max_qi*0.7):
TARGET.dead = false; TARGET.CoD = null; TARGET.stun = 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;
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>-TARGET.STATS.max_qi*TARGET.STATS.caliber):
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 its 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... */
setup.ENGINE.qiAdd(CASTER.STATS.max_qi*3, TARGET);
}
TARGET.STATS.STR += setup.ENGINE.rand(0.4, 2.1)*(amt/3);
TARGET.STATS.END += setup.ENGINE.rand(0.3, 1.9)*(amt/3);
TARGET.STATS.PHY += setup.ENGINE.rand(0.3, 1.7)*(amt/3);
TARGET.STATS.SPD += setup.ENGINE.rand(0.2, 0.9)*(amt/3);
TARGET.STATS.INS += setup.ENGINE.rand(0.1, 0.5)*(amt/3);
TARGET.STATS.WSD += setup.ENGINE.rand(0.1, 0.5)*(amt/3);
Object.keys(setup.BODY).forEach(function(key) {
if(setup.BODY[key].type=='muscle') {
regrow = Math.min(TARGET.BODY[key].damage, setup.ENGINE.rand(0.06, 1.34)*TARGET.STATS.caliber);
TARGET.BODY[key].damage -= regrow;
gain = Math.min(setup.ENGINE.sqrt(TARGET.STATS.caliber, '-'), Math.max(1, (regrow/TARGET.STATS.caliber) + (setup.ENGINE.rand(0.06, 1.34)*(amt/42))));
TARGET.BODY[key].train += gain;
TARGET.BODY[key].train = Math.min(TARGET.BODY[key].train, TARGET.STATS.caliber);
}
});
switch(true) {
case (TARGET.METRICS.age<17):
var age_plus = setup.ENGINE.rand(1.0, 4.0);
TARGET.METRICS.bust += Math.ceil(setup.ENGINE.unstack(age_plus)*setup.ENGINE.rand(0.16, 1.34));
ht_plus2 = setup.ENGINE.stack(age_plus);
TARGET.METRICS.age+=age_plus;
TARGET.METRICS.ht += ht_plus2;
out += ' Before your eyes '+ (you ? 'your body' : setup.ENGINE.he_she(gender)) +' matures and grows '+ setup.ENGINE.formatHeight(ht_plus2) + ' taller, filling out in all the right ways...';
break;
case (TARGET.METRICS.age>23):
var age_minus = Math.ceil((TARGET.METRICS.age-16)/6);
TARGET.METRICS.age-= age_minus;
out += ' You watch as the years seem to melt off';
if(settings.mac_heightGain) {
ht_plus2 = setup.ENGINE.unstack(age_minus);
TARGET.METRICS.ht += ht_plus2;
out += ' and '+ (you ? 'you even grow ' : TARGET.name_first +' even grows ')+ setup.ENGINE.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';
if(settings.mac_heightGain) {
ht_plus1 = Math.round(setup.ENGINE.unstack(amt*setup.ENGINE.rand(0.1, 1.6)));
TARGET.METRICS.ht += ht_plus1;
if(settings.mac_breastExpansion && (('female'==gender)||('futa'==gender))) { TARGET.METRICS.bust+=Math.ceil(ht_plus1*setup.ENGINE.rand(0.16, 1.34)); }
out += ', surging up another '+ setup.ENGINE.formatHeight(ht_plus1);
}
out += ', '+(you ? 'your' : setup.ENGINE.his_her(gender)) +' already impressive muscles swell obscenely, with thick veins snaking across titanic peaks.';
return out;
},
'wildSurge' : function(CASTER, TARGET) {
var out = '';
if(!TARGET.X) { TARGET.X={}; } if(!TARGET.A) { TARGET.A={}; }
$GAMEDATA.WORLD.girlPower += 0.1;
var tGen = (TARGET.gender || TARGET.TRAITS.gender).toLowerCase();
var cGen = (CASTER.gender || CASTER.TRAITS.gender).toLowerCase();
var cCal = CASTER.STATS.caliber; var cSurge = setup.ENGINE.rand(cCal/6, cCal)/6;
var tCal = TARGET.STATS.caliber; var tSurge = setup.ENGINE.rand(cCal/6, tCal);
TARGET.X.lifeShards = (TARGET.X.lifeShards||0) +1; TARGET.A.surgeTotal = (TARGET.A.surgeTotal||0) +tSurge;
CASTER.X.lifeShards = (CASTER.X.lifeShards||0) +1; CASTER.A.surgeTotal = (CASTER.A.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.A.surgeTotal>((TARGET.STATS.caliber+TARGET.X.lifeShards)*TARGET.STATS.caliber)) || (TARGET.dead && (TARGET.MATRIX.qi<-TARGET.STATS.max_qi*TARGET.STATS.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...';
setup.ENGINE.qiAdd(-CASTER.STATS.max_qi, TARGET);
} else {
/* ADD MUTATION BRANCH that creates Monsters and Metas... */
out += ' you can feel the power radiating from '+ setup.ENGINE.his_her(tGen) +' glorious new form!';
out += setup.ENGINE.wildSurge_boost(CASTER, TARGET, tSurge);
}
if(CASTER.name==$GAMEDATA.PC.name) {
/* caster was player... */
out += ' The Primal Energies from the Surge cause your own muscles to swell as well...<br />';
out += setup.ENGINE.wildSurge_boost(CASTER, CASTER, cSurge);
} else {
/* do we need to describe a hidden caster? */
out += '';
}
return out;
},
'workoutTable' : function(activity, HOURS, LEVELS, CHAR) {
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};
CHAR=CHAR||$GAMEDATA.PC;
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 = setup.ENGINE.maxHours('TRAIN', activity, LEVELS[lv], CHAR);
Object.keys(HOURS).forEach(function(h){
switch(h) {
case 'auto': hrs = CHAR.STATS.workout_hrs; break;
case 'max': hrs = max_hours; break;
default: hrs = HOURS[h]; break;
}
twine_link = ((hrs>max_hours) ? '<hr/>' : "<<link '"+ (hrs*60).toFixed(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;
},
'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;
},
'write_epitaph' : function(CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
return ((CHAR.PASSAGES && CHAR.PASSAGES.epitaph) ? "<<include '"+ CHAR.PASSAGES.epitaph +"'>>" : 'R.I.P.') + setup.ENGINE.secondChance(CHAR);
},
'WTF' : function(WTF_DATA, popAlert) {
var wtfo = JSON.stringify(WTF_DATA);
setup.ENGINE.debugLog(wtfo);
if(popAlert) { alert(wtfo); }
},
'xp_curve' : function(lv, mod1, rate1, exp, rate2, mod2) {
return (( setup.ENGINE.pow(((lv+mod1)*rate1), exp, '-') *rate2)+mod2);
},
}>><<set setup.STATUSES = {
'weight' : function(CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
var cond = null;
var whRatio = CHAR.METRICS.wt/CHAR.METRICS.base_ht;
switch(true) {
case (whRatio<1):
cond = 'dead from starvation';
CHAR.CoD='died of starvation...';
CHAR.dead=true;
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) {
CHAR=CHAR||$GAMEDATA.PC;
var cond = null;
var gender = null;
var pronoun = null;
var x = 1;
gender = ((CHAR.TRAITS && CHAR.TRAITS.gender) ? CHAR.TRAITS.gender : (CHAR.gender ? CHAR.gender : 'unknown')).toLowerCase();
switch(true) {
case (gender=='male'): case (gender=='none'): pronoun='his'; break;
case (gender=='female'): case (gender=='futa'): pronoun='her'; x=CHAR.STATS.caliber; break;
default: pronoun='their'; break;
}
switch(true) {
case (CHAR.MATRIX.qi<(CHAR.STATS.max_qi * -1.00*x)):
cond = 'killed';
CHAR.CoD = 'died of '+ pronoun +' injuries...';
CHAR.dead=true;
break;
case (CHAR.MATRIX.qi<(CHAR.STATS.max_qi * 0.00)): cond = 'unconscious'; break;
default: break;
}
if(CHAR.STATUS.qi != cond) {
/* status changed */
}
CHAR.STATUS.qi = cond;
},
'tough' : function(CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
var cond = null;
switch(true) {
case (CHAR.MATRIX.tough<(setup.ENGINE.maxResource('tough', CHAR) * 0.00)): cond = 'hurt'; break;
case (CHAR.MATRIX.tough<(setup.ENGINE.maxResource('tough', CHAR) * 0.50)): cond = 'bruised'; break;
default: break;
}
if(CHAR.STATUS.tough != cond) {
/* status changed */
}
CHAR.STATUS.tough = cond;
},
'power' : function(CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
var cond = null;
switch(true) {
case (CHAR.MATRIX.power<(setup.ENGINE.maxResource('power', CHAR) * 0.00)): cond = 'limp'; break;
case (CHAR.MATRIX.power<(setup.ENGINE.maxResource('power', CHAR) * 0.50)): cond = 'weak'; break;
default: break;
}
if(CHAR.STATUS.power != cond) {
/* status changed */
}
CHAR.STATUS.power = cond;
},
'vigor' : function(CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
var cond = null;
switch(true) {
case (CHAR.MATRIX.vigor<(setup.ENGINE.maxResource('vigor', CHAR) * 0.00)): cond = 'exhausted'; break;
case (CHAR.MATRIX.vigor<(setup.ENGINE.maxResource('vigor', CHAR) * 0.50)): cond = 'tired'; break;
default: break;
}
if(CHAR.STATUS.vigor != cond) {
/* status changed */
}
CHAR.STATUS.vigor = cond;
},
/* 'thin' */
/* 'starving' */
/* 'fat' */
/* 'malnourished' */
/* 'depressed' */
/* 'angry' */
/* 'overweight' */
/* 'fit' */
/* 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.Lisa_Irons'>><<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'] = {
'NAMES': {
'first' : "Cindy",
'full' : "Cindy Phoenix",
'birth' : "Cindy Williams",
'stage' : "Cindy Campbell",
'online' : "Cindy Phoenix",
},
'TRAITS':{
'gender' : "female",
'species' : "human",
/* 'skin_type' : "", */
/* 'skin_color' : "", */
/* 'skin_condition' : "", */
/* 'hair_length' : "", */
/* 'hair_color' : "", */
/* 'hair_style' : "", */
/* 'hair_condition' : "", */
/* 'eye_color' : "", */
/* 'eye_condition' : "", */
/* 'face' : "", */
},
'PASSAGES':{
'start' : "START CINDY",
'home' : "LIVING IN CAR",
'travel' : "DRIVE SOMEWHERE",
},
'STATS':{
/* PRIMARY STATS - used to calc maxes for secondary stats */
'STR' : 5.00,
'END' : 5.00,
'SPD' : 5.00,
'PHY' : 5.00,
'INS' : 5.00,
'WSD' : 5.00,
'level' : 5.00,
'caliber' : 2.00,
'workout_hrs': 0.10,
'karmic_well': 30.00,
},
'MATRIX':{
/* SECONDARY STATS - current values (renewable resources) */
'tough' : 10.0, /* STRxEND - [P] resistance to damage */
'power' : 10.0, /* STRxSPD - [P] physical force/lift */
'vigor' : 10.0, /* STRxPHY - [P] stamina */
'skill' : 10.0, /* STRxINS - [H] precision/accuracy */
'train' : 10.0, /* STRxWSD - [H] discipline/training */
'regen' : 10.0, /* ENDxSPD - [P] regeneration/healing */
'vital' : 10.0, /* ENDxPHY - [P] health */
'force' : 10.0, /* ENDxINS - [H] force of will */
'guard' : 10.0, /* ENDxWSD - [H] active defense */
'metab' : 10.0, /* SPDxPHY - [P] metabolism */
'fight' : 10.0, /* SPDxINS - [H] offensive speed/action time */
'react' : 10.0, /* SPDxWSD - [H] defensive speed/reaction time */
'focus' : 10.0, /* PHYxINS - [H] attention to detail */
'aware' : 10.0, /* PHYxWSD - [H] alertness to environment */
'psych' : 10.0, /* INSxWSD - [M] psionic energy */
/* 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' : 63.0, /* height, inches */
'ht' : 63.0, /* height, inches */
'wt' : 98.0, /* weight, pounds */
'adj_wt' : 98.0, /* adjusted weight, pounds */
'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' : 2, /* base cup size */
'cup' : "a", /* */
'waist' : 19.0, /* */
'hips' : 27.0, /* */
'BMI' : 'not-set', /* */
'bodyfat' : 'not-set', /* */
},
'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 */
},
'EQUIP':{
/* SLOT:ID */
'bra' :"D01_A13_I02",
'panties' :"D01_A13_I03",
'pants' :"D01_A09_I02",
'overshirt' :"D01_A10_I01",
'socks' :"D01_A13_I01",
},
'PROPERTY':{
'car':{},
},
'STATE':{
'saveVersion' : 0.2,
'feedbackQueue' : [],
'Date' : new Date(),
'lastPassage' : null,
'lastExercise' : null,
'lastActivity' : null,
'lastAction' : null,
'lastItem' : null,
},
'SLAVES':{},
'ENEMIES':{},
'FRIENDS':{},
'LOVERS':{},
'POWERS':{
'Super-Physique':{
'level':0.0,
'max':3.0,
'locked':true,
'hidden':true,
},
},
'SKILLS':{},
'DEVICES':{},
'BODY':{
'Calves' :{ 'train':1.4, 'damage':0.0, },
'Quads' :{ 'train':1.2, 'damage':0.0, },
'Hams' :{ 'train':1.1, 'damage':0.0, },
'Glutes' :{ 'train':1.4, 'damage':0.0, },
'Hips' :{ 'train':1.2, 'damage':0.0, },
'LoBack' :{ 'train':1.1, 'damage':0.0, },
'Lats' :{ 'train':1.1, 'damage':0.0, },
'Traps' :{ 'train':1.1, 'damage':0.0, },
'Abs' :{ 'train':1.6, 'damage':0.0, },
'Pecs' :{ 'train':1.1, 'damage':0.0, },
'Delts' :{ 'train':1.4, 'damage':0.0, },
'LeftTri' :{ 'train':1.0, 'damage':0.0, },
'RightTri' :{ 'train':1.0, 'damage':0.0, },
'LeftBi' :{ 'train':1.1, 'damage':0.0, },
'RightBi' :{ 'train':1.1, 'damage':0.0, },
'LeftFore' :{ 'train':1.1, 'damage':0.0, },
'RightFore' :{ 'train':1.1, 'damage':0.0, },
'LeftGrip' :{ 'train':1.1, 'damage':0.0, },
'RightGrip' :{ 'train':1.1, 'damage':0.0, },
'Cardio' :{ 'train':2.0, 'damage':0.8, },
'Kegel' :{ 'train':1.4, 'damage':0.0, },
'Brain' :{ 'train':2.0, 'damage':0.6, },
},
'IS':{},
'BS':{},
'ES':{},
'EQ':{},
/* END setup.CHARS['Cindy Phoenix'] */ }>><<set setup.PASSAGES={
/* EXERCISES */
'GO FOR A WALK' :{
'setup' : function() {
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('walking');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "<<include 'POST WORKOUT'>>";
},
'ENCOUNTERS':{
'nothing' : function() { return 50; },
'bill_RANDOM' : function() { return 10; },
'wallet_RANDOM' : function() { return 4; },
'cart_RANDOM' : function() { return ($GAMEDATA.PC.PASSAGES.home=='LIVING IN CAR' ? 10 : 0); },
'car_RANDOM' : function() { return 5; },
'stalker' : function() { return 4; },
'enemy' : function() { return 3; },
},
},
'GO FOR A JOG' :{
'setup' : function() {
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('jogging');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "<<include 'POST WORKOUT'>>";
},
'ENCOUNTERS':{
'nothing' : function() { return 60; },
'bill_RANDOM' : function() { return 10; },
'wallet_RANDOM' : function() { return 3; },
'cart_RANDOM' : function() { return ($GAMEDATA.PC.PASSAGES.home=='LIVING IN CAR' ? 10 : 0); },
'car_RANDOM' : function() { return 5; },
'stalker' : function() { return 3; },
'enemy' : function() { return 2; },
},
},
'GO FOR A RUN' :{
'setup' : function() {
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('running');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "<<include 'POST WORKOUT'>>";
},
'ENCOUNTERS':{
'nothing' : function() { return 70; },
'bill_RANDOM' : function() { return 10; },
'wallet_RANDOM' : function() { return 2; },
'cart_RANDOM' : function() { return ($GAMEDATA.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() {
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('aerobicising to the beat','working out');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "<<include 'POST WORKOUT'>>";
},
'ENCOUNTERS':{
'nothing' : function() { return 10; },
},
},
'DO CALISTHENICS' :{
'setup' : function() {
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('doing your calisthenics routine');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "<<include 'POST WORKOUT'>>";
},
'ENCOUNTERS':{
'nothing' : function() { return 10; },
},
},
'DO YOGA' :{
'setup' : function() {
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('doing yoga', 'stretching');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "<<include 'POST WORKOUT'>>";
},
'ENCOUNTERS':{
'nothing' : function() { return 10; },
},
},
'PUSH YOURSELF' :{
'setup' : function() {
switch($GAMEDATA.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;
}
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('pushing yourself to the limit','trying to kill yourself');
return null;
},
'exit' : function() {
setup.ENGINE.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 && $GAMEDATA.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 ? 10 : 0); },
},
},
/* v0.3 */
'GYM' :{
'setup' : function() {
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('at the gym','getting ready for a workout');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "<<print setup.ENGINE.carOrCab();>>";
},
'ENCOUNTERS':{
'nothing' : function() { return 72; },
},
/* planning-only, not yet implemented... gym has 2 main shifts, and an overlap */
'SCHEDULE':{
'OPENING':{
'start' :'06:30',
'end' :'07:00',
'locked' :true,
'staff' :true,
},
'OPEN':{
'start' :'07:00',
'end' :'21:30',
'locked' :false,
'staff' :true,
},
'CLOSING':{
'start' :'21:30',
'end' :'22:00',
'locked' :false,
'staff' :true,
},
'CLOSED':{
'start' :'22:00',
'end' :'06:30',
'locked' :true,
'staff' :false,
},
},
/* planning-only, not yet implemented... gym has 2 main shifts, and an overlap */
'NPCS':{
/* replace with UID designations */
'Katie':{},
},
},
'GAS STATION' :{
'setup' : function() {
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('at the gas station','getting gas');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "<<print setup.ENGINE.carOrCab();>>";
},
'ENCOUNTERS':{
'nothing' : function() { return 72; },
},
},
'MOTEL' :{
'setup' : function() {
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('at the motel','checking in');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "<<print setup.ENGINE.carOrCab();>>";
},
'ENCOUNTERS':{
'nothing' : function() { return 72; },
},
},
'DINER' :{
'setup' : function() {
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('at the diner','waiting to be seated','waiting for your food','eating');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "<<print setup.ENGINE.carOrCab();>>";
},
'ENCOUNTERS':{
'nothing' : function() { return 72; },
},
},
'GO HOME' :{
'setup' : function() {
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('home','heading home');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "
<<set _home=$GAMEDATA.PC.PASSAGES.home>>
<<include 'STATS'>><<include 'RESOURCES'>><<include _home>>
";
},
'ENCOUNTERS':{
'nothing' : function() { return 10; },
},
},
'LIVING ON STREET' :{
'setup' : function() {
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('on the street');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "";
},
'ENCOUNTERS':{
'nothing' : function() { return 10; },
},
},
'LIVING IN PRISON' :{
'setup' : function() {
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.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.ENGINE.showSideBar();
return "";
},
'ENCOUNTERS':{
'nothing' : function() { return 10; },
},
},
'LIVING IN CAR' :{
'setup' : function() {
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('in your car','sitting there','sitting there listening to the radio','planning your day');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "";
},
'ENCOUNTERS':{
'nothing' : function() { return 10; },
},
},
'LIVING IN MOTEL' :{
'setup' : function() {
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('in your room','watching tv','watching the news','channel surfing');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "";
},
'ENCOUNTERS':{
'nothing' : function() { return 10; },
},
},
'SLEEP IN CAR' :{
'setup' : function() {
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('sleeping','sleeping in your car');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "<br/><<goto 'GO HOME'>>";
},
'ENCOUNTERS':{
'nothing' : function() { return 10; },
},
},
'SLEEP IN BED' :{
'setup' : function() {
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('sleeping','lying in bed, staing at the ceiling');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "<br/><<goto 'GO HOME'>>";
},
'ENCOUNTERS':{
'nothing' : function() { return 10; },
},
},
'REST A BIT' :{
'setup' : function() {
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('resting','recovering from your workout','catching your breath');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "<br/><<goto 'GO HOME'>>";
},
'ENCOUNTERS':{
'nothing' : function() { return 10; },
},
},
'TAKE A NAP' :{
'setup' : function() {
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('napping','snoozing','snoring','resting','recovering from your workout','catching your breath');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "<br/><<goto 'GO HOME'>>";
},
'ENCOUNTERS':{
'nothing' : function() { return 10; },
},
},
'LOOK FOR CHANGE' :{
'setup' : function() {
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('scrounging the parking lot','looking for change');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "
<<if setup.ENGINE.canDo('EXPLORE', 'search', 30/60)>>
<p class='keypress' key='[ENTER]'><<link 'KEEP LOOKING'>><<goto 'LOOK FOR CHANGE'>><</link>></p>
<</if>>
<p>[[GO INSIDE->SHOP S-MART]]</p>
<p class='keypress' key='[SPACE]'>[[RETURN TO CAR->GO HOME]]</p>
";
},
'ENCOUNTERS':{
'nothing' : function() { return 72; },
'bill_RANDOM' : function() { return 20; },
'wallet_RANDOM' : function() { return 2; },
'cart_RANDOM' : function() { return 16; },
'car_RANDOM' : function() { return 32; },
'stalker' : function() { return 6; },
'enemy' : function() { return 3; },
},
},
/*S-MART*/
'SHOP S-MART' :{
'setup' : function() {
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('shopping','browsing');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "<p></p><p class='narrow keypress' key='[SPACE]'>[[GO HOME]]</p>";
},
'ENCOUNTERS':{
'nothing' : function() { return 10; },
},
},
'CHECKOUT APPAREL' :{
'setup' : function() {
var dept = either('apparel',( _aisle ? setup.ENGINE.getAisleName(_aisle) : 'stuff'),'clothing');
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('shopping','browsing','checking out '+dept,'checking out the '+dept+' department');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "
<p></p>
<p></p>
<p class='keypress' key='[ESC]'>[[CHECK OUT ANOTHER DEPARTMENT->SHOP S-MART]]</p>
";
},
'ENCOUNTERS':{
'nothing' : function() { return 10; },
},
},
'CHECKOUT AUTOMOTIVE' :{
'setup' : function() {
var dept = either('automotive',( _aisle ? setup.ENGINE.getAisleName(_aisle) : 'stuff'),'auto parts');
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('shopping','browsing','checking out '+dept,'checking out the '+dept+' department');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "
<p></p>
<p></p>
<p class='keypress' key='[ESC]'>[[CHECK OUT ANOTHER DEPARTMENT->SHOP S-MART]]</p>
";
},
'ENCOUNTERS':{
'nothing' : function() { return 10; },
},
},
'CHECKOUT ELECTRONICS' :{
'setup' : function() {
var dept = either('electronics',( _aisle ? setup.ENGINE.getAisleName(_aisle) : 'stuff'),'gadgets and gizmos');
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('shopping','browsing','checking out '+dept,'checking out the '+dept+' department');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "
<p></p>
<p></p>
<p class='keypress' key='[ESC]'>[[CHECK OUT ANOTHER DEPARTMENT->SHOP S-MART]]</p>
";
},
'ENCOUNTERS':{
'nothing' : function() { return 10; },
},
},
'CHECKOUT FURNITURE' :{
'setup' : function() {
var dept = either('furniture',( _aisle ? setup.ENGINE.getAisleName(_aisle) : 'stuff'));
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('shopping','browsing','checking out '+dept,'checking out the '+dept+' department');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "
<p></p>
<p></p>
<p class='keypress' key='[ESC]'>[[CHECK OUT ANOTHER DEPARTMENT->SHOP S-MART]]</p>
";
},
'ENCOUNTERS':{
'nothing' : function() { return 10; },
},
},
'CHECKOUT GARDEN' :{
'setup' : function() {
var dept = either('garden center',( _aisle ? setup.ENGINE.getAisleName(_aisle) : 'stuff'));
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('shopping','browsing','checking out '+dept,'checking out the '+dept+' department');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "
<p></p>
<p></p>
<p class='keypress' key='[ESC]'>[[CHECK OUT ANOTHER DEPARTMENT->SHOP S-MART]]</p>
";
},
'ENCOUNTERS':{
'nothing' : function() { return 10; },
},
},
'CHECKOUT GROCERY' :{
'setup' : function() {
var dept = either('grocery',( _aisle ? setup.ENGINE.getAisleName(_aisle) : 'stuff'));
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('shopping','browsing','checking out '+dept,'checking out the '+dept+' department');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "
<p></p>
<p></p>
<p class='keypress' key='[ESC]'>[[CHECK OUT ANOTHER DEPARTMENT->SHOP S-MART]]</p>
";
},
'ENCOUNTERS':{
'nothing' : function() { return 10; },
},
},
'CHECKOUT HARDWARE' :{
'setup' : function() {
var dept = either('hardware',( _aisle ? setup.ENGINE.getAisleName(_aisle) : 'stuff'));
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('shopping','browsing','checking out '+dept,'checking out the '+dept+' department');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "
<p></p>
<p></p>
<p class='keypress' key='[ESC]'>[[CHECK OUT ANOTHER DEPARTMENT->SHOP S-MART]]</p>
";
},
'ENCOUNTERS':{
'nothing' : function() { return 10; },
},
},
'CHECKOUT HOUSEHOLD' :{
'setup' : function() {
var dept = either('household',( _aisle ? setup.ENGINE.getAisleName(_aisle) : 'stuff'),'furnishings');
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('shopping','browsing','checking out '+dept,'checking out the '+dept+' department');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "
<p></p>
<p></p>
<p class='keypress' key='[ESC]'>[[CHECK OUT ANOTHER DEPARTMENT->SHOP S-MART]]</p>
";
},
'ENCOUNTERS':{
'nothing' : function() { return 10; },
},
},
'CHECKOUT HYGIENE' :{
'setup' : function() {
var dept = either('hygiene',( _aisle ? setup.ENGINE.getAisleName(_aisle) : 'stuff'));
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('shopping','browsing','checking out '+dept,'checking out the '+dept+' department');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "
<p></p>
<p></p>
<p class='keypress' key='[ESC]'>[[CHECK OUT ANOTHER DEPARTMENT->SHOP S-MART]]</p>
";
},
'ENCOUNTERS':{
'nothing' : function() { return 10; },
},
},
'CHECKOUT OFFICE' :{
'setup' : function() {
var dept = either('office',( _aisle ? setup.ENGINE.getAisleName(_aisle) : 'stuff'),'office supplies');
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('shopping','browsing','checking out '+dept,'checking out the '+dept+' department');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "
<p></p>
<p></p>
<p class='keypress' key='[ESC]'>[[CHECK OUT ANOTHER DEPARTMENT->SHOP S-MART]]</p>
";
},
'ENCOUNTERS':{
'nothing' : function() { return 10; },
},
},
'CHECKOUT PHARMACY' :{
'setup' : function() {
var dept = either('pharmacy',( _aisle ? setup.ENGINE.getAisleName(_aisle) : 'stuff'));
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('shopping','browsing','checking out '+dept,'checking out the '+dept+' department');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "
<p></p>
<p></p>
<p class='keypress' key='[ESC]'>[[CHECK OUT ANOTHER DEPARTMENT->SHOP S-MART]]</p>
";
},
'ENCOUNTERS':{
'nothing' : function() { return 10; },
},
},
'CHECKOUT SEASONAL' :{
'setup' : function() {
var dept = either('seasonal',( _aisle ? setup.ENGINE.getAisleName(_aisle) : 'stuff'));
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('shopping','browsing','checking out '+dept,'checking out the '+dept+' department');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "
<p></p>
<p></p>
<p class='keypress' key='[ESC]'>[[CHECK OUT ANOTHER DEPARTMENT->SHOP S-MART]]</p>
";
},
'ENCOUNTERS':{
'nothing' : function() { return 10; },
},
},
'CHECKOUT SPORTING GOODS' :{
'setup' : function() {
var dept = either('sporting goods',( _aisle ? setup.ENGINE.getAisleName(_aisle) : 'stuff'),'sports');
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('shopping','browsing','checking out '+dept,'checking out the '+dept+' department');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "
<p></p>
<p></p>
<p class='keypress' key='[ESC]'>[[CHECK OUT ANOTHER DEPARTMENT->SHOP S-MART]]</p>
";
},
'ENCOUNTERS':{
'nothing' : function() { return 10; },
},
},
'ENTER BATHROOM' :{
'setup' : function() {
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('in the bathroom');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "
<p></p>
<p class='keypress' key='[ESC]'>[[LEAVE->SHOP S-MART]]</p>
";
},
'ENCOUNTERS':{
'nothing' : function() { return 10; },
},
},
'FILLOUT APPLICATION' :{
'setup' : function() {
$GAMEDATA.PC.STATE.lastPassage = State.passage;
$GAMEDATA.PC.STATE.passageDesc = either('filling out an application');
return null;
},
'exit' : function() {
setup.ENGINE.showSideBar();
return "
<p></p>
<p></p>
<p class='keypress' key='[ESC]'>[[RETURN->SHOP S-MART]]</p>
";
},
'ENCOUNTERS':{
'nothing' : function() { return 10; },
},
},
/* 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.ENGINE.do_status_update();
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 its 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!',
'Its 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!',
'Its gonna be a great day!',
'Wait, was this in the garbage?',
'You wonder what happened to its owner.'
) +' '+ post;
},
},
'bill_1':{
'setup' : function() { return ''; },
'replace' : false,
'overrideExit' : false,
'hideMenu' : false,
'beforePassage' : function() { return ''; },
'replacePassage' : function() { return ''; },
'afterPassage' : function() {
$GAMEDATA.PC.MATRIX.money += 1.00;
setup.ENGINE.karmaAdd(-0.10, $GAMEDATA.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() {
$GAMEDATA.PC.MATRIX.money += 2.00;
setup.ENGINE.karmaAdd(+100.0, $GAMEDATA.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() {
$GAMEDATA.PC.MATRIX.money += 5.00;
setup.ENGINE.karmaAdd(-0.50, $GAMEDATA.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() {
$GAMEDATA.PC.MATRIX.money += 10.00;
setup.ENGINE.karmaAdd(-1.00, $GAMEDATA.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() {
$GAMEDATA.PC.MATRIX.money += 20.00;
setup.ENGINE.karmaAdd(-2.00, $GAMEDATA.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() {
$GAMEDATA.PC.MATRIX.money += 50.00;
setup.ENGINE.karmaAdd(-5.00, $GAMEDATA.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() {
$GAMEDATA.PC.MATRIX.money += 100.00;
setup.ENGINE.karmaAdd(-10.00, $GAMEDATA.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.ENGINE.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.ENGINE.enc_moreDetail('CHECK FOR CASH', "check_cash", 'wallet_MASTER', {'hotkey':'Q'});
choices += setup.ENGINE.enc_moreDetail('LOOK FOR ID', "check_id", 'wallet_MASTER', {'hotkey':'W'});
choices += setup.ENGINE.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.ENGINE.formatHeight(_LICENSE.ht)+", "+
setup.ENGINE.formatWeight(_LICENSE.wt)+", "+
_LICENSE.age +" year old "+
_LICENSE.genpro +" named ""+ _LICENSE.name +
"", what do you do with it?</p>";
out += setup.ENGINE.enc_moreDetail('TAKE THE '+_LICENSE.cardtype.toUpperCase(), "take_id", 'wallet_MASTER');
return out;
},
'take_id' : function() {
if(_turned_in) {
return "<p>Its too late, you've already turned the wallet in!</p>";
}
_took_id = true;
setup.ENGINE.lightAdd(-20.00, $GAMEDATA.PC);
$GAMEDATA.PC.JUNK[_LICENSE.cardtype+'-'+Date.now()] = _LICENSE.name + ''s ' + _LICENSE.cardtype +
' (' + _LICENSE.gender + ' age ' + _LICENSE.age +
", "+setup.ENGINE.formatHeight(_LICENSE.ht)+
", "+setup.ENGINE.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.ENGINE.lightAdd(-(20+(_cash*3)+( _checked_cash ? 10 : 0 )), $GAMEDATA.PC);
$GAMEDATA.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.ENGINE.showSideBar();
return out + setup.PASSAGES[$GAMEDATA.PC.STATE.lastPassage].exit();
},
'keep_wallet' : function() {
setup.ENGINE.lightAdd(-(50+(_cash*3)), $GAMEDATA.PC);
$GAMEDATA.PC.MATRIX.money += _cash;
$GAMEDATA.PC.JUNK['wallet-'+Date.now()] = _wallet;
if(!_took_id) {
setup.ENGINE.lightAdd(-20.00, $GAMEDATA.PC);
$GAMEDATA.PC.JUNK[_LICENSE.cardtype+'-'+Date.now()] = _LICENSE.name + ''s ' + _LICENSE.cardtype +
' (' + _LICENSE.gender + ' age ' + _LICENSE.age +
", "+setup.ENGINE.formatHeight(_LICENSE.ht)+
", "+setup.ENGINE.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.ENGINE.showSideBar();
return out + setup.PASSAGES[$GAMEDATA.PC.STATE.lastPassage].exit();
},
'turn_in' : function() {
/* add karma */
setup.ENGINE.lightAdd(+(50+(_cash*3)+( _checked_cash ? -20 : 50 )), $GAMEDATA.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.ENGINE.enc_showChoices({
'GIVE HER YOUR NUMBER' : "give_number",
'DON'T TRUST HER' : "dont_give_number",
},
'wallet_MASTER'
);
},
'give_number' : function() {
/* add karma */
setup.ENGINE.lightAdd(-10.00, $GAMEDATA.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.ENGINE.showSideBar();
return out + setup.PASSAGES[$GAMEDATA.PC.STATE.lastPassage].exit();
},
'dont_give_number' : function() {
/* add karma */
setup.ENGINE.darkAdd(-10.00, $GAMEDATA.PC);
var out = "<p>You decide it might not be the best idea... they might ask questions.</p>";
setup.ENGINE.showSideBar();
return out + setup.PASSAGES[$GAMEDATA.PC.STATE.lastPassage].exit();
},
},
'beforePassage' : function() { return ''; },
'replacePassage' : function() { return ''; },
'afterPassage' : function() {
var doing = setup.ENGINE.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 wallet = either(
'black stamped leather',
'crockodile skin',
'leather',
'red leather',
'brown leather',
'black leather',
'blue velvet',
'crushed red velvet',
'burgandy velvet',
'black velvet',
'leopard velvet',
'blue cloth',
'black cloth',
'red cloth',
'green cloth',
) +' wallet';
State.setVar( '_wallet', wallet );
var cash = setup.ENGINE.findCash(0, 500);
State.setVar( '_cash', cash );
var LICENSE = setup.ENGINE.randomID();
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.ENGINE.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.ENGINE.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 its 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 (It's 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... its 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.ENGINE.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.ENGINE.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.ENGINE.enc_moreDetail('COLLECT THE BUMPER (sticker)', "collect_bumper", 'car_MASTER', {'hotkey':'Q'});
}
if(!_owner_present) {
choices += setup.ENGINE.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.ENGINE.enc_showChoices(ACTIONS,
'car_MASTER', {
'choices_id' : 'car_choices',
}
);
return choices;
},
'whatDoYouDo_toTheCar' : function() {
var choices = '';
choices += setup.ENGINE.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.ENGINE.him_her(_P2.gender).toUpperCase();
var warn = '<small><small><i>(WARNING: this will take you out of the car encounter!)</i></small></small>';
choices += setup.ENGINE.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.ENGINE.calcReps('Bent-over Row', weight, $GAMEDATA.PC);
var owner_reaction = '';
if(!_vehicle_gone) {
/* get credit for the workout */
setup.ENGINE.doLift('Bent-over Row', weight, 'STR', $GAMEDATA.PC);
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.ENGINE.he_she(_P2.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 nearly tore the back end off... 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.ENGINE.he_she(_P2.gender)+" says, "+setup.ENGINE.his_her(_P2.gender)+" voice trailing off.";
break;
case (reps>= 50.0):
out+='You tear the bumper off with ease...';
owner_reaction = ""-the fuck?", the owner says, backing away, "stay back you crazy bitch, I'm'a call the cops!"";
break;
case (reps>= 5.0):
out+='You rip the bumper off and add it to your sticker collection...';
owner_reaction = ""-the hell's wrong with you? You can't just go around destroyin' other people's shit!"";
break;
case (reps>= 1.0):
out+='Straining mightily, you manage to rip the bumper off for your collection...';
owner_reaction = " _P2.name is fuming, "You ripped off my fucking bumper!"";
break;
}
} else {
out+='too late now... its gone.';
}
return out +(_owner_present ? "<p class='npc_reaction "+_P2.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.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.ENGINE.his_her(_P2.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.ENGINE.descAge(_P2.age);
out = setup.ENGINE.a_an(descAge2) +' ' + descAge2 +' '+ _P2.genpro
+ ' by the name of '+ _P2.name +" (roughly " + setup.ENGINE.estAge(_P2.age)
+ ", about "+ _P2.ht +" tall, and looks to weigh about "+ _P2.wt
+"; You can't be sure, but it looks like "+(_P2.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.ENGINE.canDoLift('Military Press', $GAMEDATA.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.ENGINE.calcReps('Military Press', weight, $GAMEDATA.PC);
/* get credit for the workout */
setup.ENGINE.doLift('Military Press', weight, 'STR', $GAMEDATA.PC);
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 it's 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 its 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.ENGINE.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.debugInfo ? " (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 CHAR = $GAMEDATA.PC;
var out = '';
var weight = _vehicle_weight*1.34;
var reps = setup.ENGINE.calcReps('Military Press', weight, $GAMEDATA.PC);
/* get credit for the workout */
setup.ENGINE.doLift('Military Press', weight, 'STR', $GAMEDATA.PC);
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 '+ setup.ENGINE.formatLength(throw_dist*12) +' in front of you)'; CHAR.MATRIX.tough -= drop_dmg/10; setup.ENGINE.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 '+ setup.ENGINE.formatLength(throw_dist*12) +')'; CHAR.MATRIX.tough -= drop_dmg/10 /2; setup.ENGINE.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 '+ setup.ENGINE.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, its 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 '+ setup.ENGINE.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 incenerated as it enters into the Sun's Corona (having thrown it '+ setup.ENGINE.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 '+ setup.ENGINE.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 '+ setup.ENGINE.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 '+ setup.ENGINE.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 '+ setup.ENGINE.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! ('+ setup.ENGINE.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 '+ setup.ENGINE.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 '+ setup.ENGINE.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 '+ setup.ENGINE.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 ('+ setup.ENGINE.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 ('+ setup.ENGINE.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 '+ setup.ENGINE.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 '+ setup.ENGINE.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 '+ setup.ENGINE.formatLength(throw_dist*12) +' away), you can kind of see where it landed, but it will be hard to recover and its 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 ('+ setup.ENGINE.formatLength(throw_dist*12) +' away), its a bit of a walk, but its 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 '+ setup.ENGINE.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 '+ setup.ENGINE.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 '+ setup.ENGINE.formatLength(throw_dist*12) +').'; break;
/* A SHORT DISTANCE 3-9.9ft */ default: out += ' You pitch the _vehicle_type a short distance away (roughly '+ setup.ENGINE.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 = $GAMEDATA.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[$GAMEDATA.PC.STATE.lastPassage].exit();
},
'leave_it' : function() {
var out = 'You decide to leave that problem for someone else...';
return out + setup.PASSAGES[$GAMEDATA.PC.STATE.lastPassage].exit();
},
'owner_fight' : function() {
setup.ENGINE.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... its a '
+ "_vehicle_desc" + '. You're best guess is that it weighs about '
+ "<<print setup.ENGINE.formatWeight(_vehicle_weight || 0); >>"
+ (_owner_present
? '<p>'+ either(
'Standing nearby is ',
'Someone, you presume is the owner, is walking away; '+ setup.ENGINE.he_she(_P2.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.ENGINE.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 = $GAMEDATA.PC;
var P1={
'name' : $GAMEDATA.PC.name,
'name_first': $GAMEDATA.PC.name_first,
'age' : setup.ENGINE.val('age' , CHAR),
'gender' : setup.ENGINE.val('gender' , CHAR),
'ht' : setup.ENGINE.val('ht' , CHAR),
'wt' : setup.ENGINE.val('wt' , CHAR),
'str' : setup.ENGINE.statPrint('STR', CHAR),
'end' : setup.ENGINE.statPrint('END', CHAR),
'spd' : setup.ENGINE.statPrint('SPD', CHAR),
'phy' : setup.ENGINE.statPrint('PHY', CHAR),
'ins' : setup.ENGINE.statPrint('INS', CHAR),
'wsd' : setup.ENGINE.statPrint('WSD', CHAR),
'level' : (CHAR.STATS.level).toFixed(0),
'caliber' : (CHAR.STATS.caliber).toFixed(0),
'actor' : 'player',
'BODY' : CHAR.BODY,
'LIMBS' : CHAR.LIMBS,
'STATS' : CHAR.STATS,
'MATRIX' : CHAR.MATRIX,
'METRICS' : CHAR.METRICS,
'TRAITS' : CHAR.TRAITS,
'STATUS' : CHAR.STATUS,
'X' : CHAR.X,
'A' : CHAR.A,
};
P1.tone = setup.ENGINE.char_metric('bodytone', P1);
P1.fat = setup.ENGINE.char_metric('bodyfat', P1);
P1.bicep = setup.ENGINE.char_metric('bicep', P1);
P1.quads = setup.ENGINE.char_metric('quads', P1);
P1.figure = setup.ENGINE.char_metric('figure', P1);
setup.ENGINE.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() {
setup.ENCOUNTERS.wallet_DYNAMIC.setup();
var min=0.5;
var max=1.5;
var P2 = setup.ENGINE.generateCharFromLicense(_LICENSE);
P2['STATS'] = setup.ENGINE.generateRandomEncounterStats(P2);
P2['MATRIX'] = setup.ENGINE.generateRandomEncounterMatrix(P2['STATS'], min, max);
P2['level'] = (P2['STATS'].level).toFixed(0);
P2['caliber'] = (P2['STATS'].caliber).toFixed(0);
P2['BODY'] = setup.ENGINE.new_BODY(1, P2['STATS'].caliber);
P2['actor'] = 'cpu';
setup.ENGINE.regenerateBody(0.0001, 0.0001, P2);
P2['str'] = setup.ENGINE.statPrint('STR', P2);
P2['end'] = setup.ENGINE.statPrint('END', P2);
P2['spd'] = setup.ENGINE.statPrint('SPD', P2);
P2['phy'] = setup.ENGINE.statPrint('PHY', P2);
P2['ins'] = setup.ENGINE.statPrint('INS', P2);
P2['wsd'] = setup.ENGINE.statPrint('WSD', P2);
P2.STATS['karmic_well'] = setup.ENGINE.calcKarmicWell(P2.STATS);
P2.STATS['max_qi'] = P2['MATRIX']['max_qi'];
delete P2.MATRIX['max_qi'];
P2.MATRIX['light'] = P2.STATS['karmic_well']*(Math.random()*(max-min)+min);
P2.MATRIX['dark'] = P2.STATS['karmic_well']*(Math.random()*(max-min)+min);
setup.ENGINE.do_status_update(P2);
P2.tone = setup.ENGINE.char_metric('bodytone', P2);
P2.fat = setup.ENGINE.char_metric('bodyfat', P2);
P2.bicep = setup.ENGINE.char_metric('bicep', P2);
P2.quads = setup.ENGINE.char_metric('quads', P2);
P2.figure = setup.ENGINE.char_metric('figure', P2);
P2.wt = setup.ENGINE.char_metric('weight', P2);
State.setVar( '_P2', 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.ENGINE.enc_moreDetail('WHAT DO THEY LOOK LIKE?', "look", 'stalker', {'hotkey':'W'});
choices += setup.ENGINE.enc_showChoices({
'TALK' : "talk",
'WALK AWAY' : "walk",
'FIGHT' : "fight",
},
'stalker'
);
return choices;
},
'look' : function() {
return (_P2.gender=='male'?'He':'She')+" is a "+ setup.ENGINE.descAge(_P2.age) +' '+ _P2.genpro + ", roughly " + setup.ENGINE.estAge(_P2.age) + ", about "+ _P2.ht +" tall, and looks to weigh about "+ _P2.wt +" and you can't be sure, but it looks like "+(_P2.gender=='male'?'his':'her')+" arms are about " + _P2.bicep +" around.";
},
'talk' : function() {
return "When you ask "+(_P2.gender=='male'?'him':'her')+" what "+(_P2.gender=='male'?'he':'she')+" wants, "+(_P2.gender=='male'?'he':'she')+" "+ either('flees', 'runs off', 'runs away', 'runs', 'retreats', 'takes off') +"."+
setup.PASSAGES[$GAMEDATA.PC.STATE.lastPassage].exit();
},
'walk' : function() {
setup.ENGINE.showSideBar();
setup.ENGINE.giveFeedback('You walk off, leaving the strange '+(_P2.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($GAMEDATA.PC.ENEMIES);
var enemy_ct = ENEMY_NAMES.length;
if(enemy_ct>0) {
var randEnemy = setup.ENGINE.rand(1, enemy_ct, true)-1;
var enemy_id = ENEMY_NAMES[randEnemy];
var P2 = $GAMEDATA.PC.ENEMIES[enemy_id];
/* When your not training, Someone else is training, To kick your Ass! */
setup.ENGINE.enemyBigger(P2, setup.ENGINE.rand(0.005, 0.015));
/* recover 3-9/6 old max qi, come in overcharged */
setup.ENGINE.qiAdd((P2.STATS.level**2)*setup.ENGINE.rand(3,9), P2);
setup.ENGINE.qiFlow(0.134, 1, P2);
setup.ENGINE.do_status_update(P2);
setup.ENGINE.refresh_fighter_info(P2);
setup.ENGINE.fighterCondition(P2);
State.setVar( '_P2', P2 );
setup.ENCOUNTERS.combat.setup();
}
return '';
},
'replace' : true,
'overrideExit' : true,
'hideMenu' : true,
'CHOICES' :{
'whatDoYouDo' : function() {
var choices = '';
choices += setup.ENGINE.enc_moreDetail('HOW MUCH BIGGER?', "look", 'enemy', {'hotkey':'W'});
choices += setup.ENGINE.enc_showChoices({
'FIGHT' : "fight",
},
'enemy'
);
return choices;
},
'look' : function() {
return (_P2.gender=='male'?'He':'She')+" is a "+ setup.ENGINE.descAge(_P2.age) +' '+ _P2.genpro + ", roughly " + setup.ENGINE.estAge(_P2.age) + ", about "+ _P2.ht +" tall, and looks to weigh about "+ _P2.wt +" and you can't be sure, but it looks like "+(_P2.gender=='male'?'his':'her')+" arms are about " + _P2.bicep +" around.";
},
'fight' : function() {
return setup.ENCOUNTERS['random_opponent'].replacePassage();
},
},
'beforePassage' : function() { return ''; },
'replacePassage' : function() {
/* if enemy found, have encounter, else skip */
if(_P2 && _P1) {
return "<p>You notice a familiar person following you... its "+ _P2.name +", "+ setup.ENGINE.he_she(_P2.gender) +" looks a bit bigger than the last time you saw "+ setup.ENGINE.him_her(_P2.gender) +", and "+ setup.ENGINE.he_she(_P2.gender) +"'s on you before you have a chace to react.</p>" +
'<div>'+ setup.ENCOUNTERS.enemy.CHOICES.whatDoYouDo() +'</div>';
} else {
return setup.PASSAGES[$GAMEDATA.PC.STATE.lastPassage].exit();
}
},
'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 */
/* xxxx */
'ENCOUNTER TEMPLATE':{
'setup' : function() { return ''; },
'replace' : false,
'overrideExit' : false,
'hideMenu' : false,
'CHOICES' :{
'whatDoYouDo' : function() {
var choices = '';
choices += setup.ENGINE.enc_moreDetail('WHAT IS CHOICE 1', "choice1", 'TEMPLATE', {'hotkey':'Q'});
choices += setup.ENGINE.enc_showChoices({
'CHOICE 1' : "choice1",
},
'TEMPLATE'
);
return choices;
},
'choice1' : function() {
var out='ya had ta pick #1';
return out + setup.PASSAGES[$GAMEDATA.PC.STATE.lastPassage].exit();
},
},
'beforePassage' : function() { return ''; },
'replacePassage' : function() { return ''; },
'afterPassage' : function() { return ''; },
},
/* END xxxx */
}>><<print setup.ENGINE.setupPassage();>><<print setup.ENGINE.beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENGINE.replacePassage();>><<else>>
NORMAL PASSAGE
<</if>>
<<print setup.ENGINE.afterPassage();>>
<<if settings.debugInfo>><p>[encounter: _encounter ]</p><</if>>
<p></p>
<<print setup.ENGINE.exitPassage();>>
ADD PASSAGE EXIT TO setup PASSAGES <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>>
Double-click this passage to edit it.Double-click this passage to edit it.<<set setup.CHARS['Tammi X'] = {
'NAMES': {
'first' : "Tammi",
'full' : "Tammi X",
/* gets replaced with creed selection */
'birth' : "Tammi X",
/* gets replaced with husband creed selection */
'married' : "Tammi X",
},
'TRAITS':{
'gender' : "female",
'species' : "human",
/* 'skin_type' : "", */
/* 'skin_color' : "", */
/* 'skin_condition' : "", */
/* 'hair_length' : "", */
/* 'hair_color' : "", */
/* 'hair_style' : "", */
/* 'hair_condition' : "", */
/* 'eye_color' : "", */
/* 'eye_condition' : "", */
/* 'face' : "", */
},
'PASSAGES':{
'start' : "START TAMMI",
'home' : "LIVING IN MOTEL",
'travel' : "CALL CAB",
},
'STATS':{
/* PRIMARY STATS - used to calc maxes for secondary stats */
'STR' : 7.00,
'END' : 25.00,
'SPD' : 8.00,
'PHY' : 7.00,
'INS' : 10.00,
'WSD' : 10.00,
'level' : 10.00,
'caliber' : 15.00,
'workout_hrs': 1.00,
'karmic_well': 40.00,
},
'MATRIX':{
/* SECONDARY STATS/ENERGY - current values (renewable resources) */
'tough' : 10.0, /* STRxEND - [P] resistance to damage */
'power' : 10.0, /* STRxSPD - [P] physical force/lift */
'vigor' : 10.0, /* STRxPHY - [P] stamina */
'skill' : 10.0, /* STRxINS - [H] precision/accuracy */
'train' : 10.0, /* STRxWSD - [H] discipline/training */
'regen' : 10.0, /* ENDxSPD - [P] regeneration/healing */
'vital' : 10.0, /* ENDxPHY - [P] health */
'force' : 10.0, /* ENDxINS - [H] force of will */
'guard' : 10.0, /* ENDxWSD - [H] active defense */
'metab' : 10.0, /* SPDxPHY - [P] metabolism */
'fight' : 10.0, /* SPDxINS - [H] offensive speed/action time */
'react' : 10.0, /* SPDxWSD - [H] defensive speed/reaction time */
'focus' : 10.0, /* PHYxINS - [H] attention to detail */
'aware' : 10.0, /* PHYxWSD - [H] alertness to environment */
'psych' : 10.0, /* INSxWSD - [M] psionic energy */
/* 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' : 67.0, /* height, inches */
'ht' : 67.0, /* height, inches */
'wt' : 154.0, /* weight, pounds */
'adj_wt' : 154.0, /* adjusted weight, pounds */
'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' : 4, /* base cup size */
'cup' : "D", /* */
'waist' : 28.0, /* */
'hips' : 33.0, /* */
'BMI' : 'not-set', /* */
'bodyfat' : 'not-set', /* */
},
'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 */
},
'EQUIP':{
/* SLOT:ID */
'bra' :"D01_A13_I02",
'panties' :"D01_A13_I03",
'pants' :"D01_A09_I02",
'overshirt' :"D01_A10_I01",
'socks' :"D01_A13_I01",
},
'PROPERTY':{
/* no car */
},
'STATE':{
'saveVersion' : 0.2,
'feedbackQueue' : [],
'Date' : new Date(),
'lastPassage' : null,
'lastExercise' : null,
'lastActivity' : null,
'lastAction' : null,
'lastItem' : null,
},
'SLAVES':{},
'ENEMIES':{},
'FRIENDS':{},
'LOVERS':{},
'POWERS':{
'Super-Endurance':{
'level':1.0,
'max':2.0,
'locked':false,
'hidden':true,
},
},
'SKILLS':{},
'DEVICES':{},
'BODY':{
'Calves' :{ 'train':1.6, 'damage': 4.1, },
'Quads' :{ 'train':3.2, 'damage':11.3, },
'Hams' :{ 'train':1.7, 'damage': 5.8, },
'Glutes' :{ 'train':2.8, 'damage': 9.7, },
'Hips' :{ 'train':2.6, 'damage': 7.1, },
'LoBack' :{ 'train':3.7, 'damage':11.8, },
'Lats' :{ 'train':1.6, 'damage': 5.2, },
'Traps' :{ 'train':3.7, 'damage':14.4, },
'Abs' :{ 'train':4.4, 'damage':34.7, },
'Pecs' :{ 'train':2.4, 'damage':16.9, },
'Delts' :{ 'train':1.6, 'damage': 3.6, },
'LeftTri' :{ 'train':1.3, 'damage': 3.6, },
'RightTri' :{ 'train':1.6, 'damage': 4.3, },
'LeftBi' :{ 'train':1.6, 'damage': 4.9, },
'RightBi' :{ 'train':1.9, 'damage': 7.7, },
'LeftFore' :{ 'train':2.1, 'damage': 6.6, },
'RightFore' :{ 'train':2.7, 'damage':11.4, },
'LeftGrip' :{ 'train':1.8, 'damage': 6.3, },
'RightGrip' :{ 'train':2.4, 'damage':10.2, },
'Cardio' :{ 'train':2.7, 'damage': 9.6, },
'Kegel' :{ 'train':2.6, 'damage':11.3, },
'Brain' :{ 'train':3.1, 'damage':11.4, },
},
'IS':{},
'BS':{},
'ES':{},
'EQ':{},
/* 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.ENGINE.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.ENGINE.canDo('EXPLORE', 'search', 15/60)>>[[GO SHOPPING->SHOP S-MART]]<</if>></p>
<p class='narrow'><<if setup.ENGINE.canDo('EXPLORE', 'search', 30/60)>>[[LOOK FOR CHANGE]]<</if>></p>
<p></p>
<p class='narrow'><<if setup.ENGINE.canDo('TRAIN', 'walk', 5/60, 0.5)>>[[GO FOR A WALK]]<</if>></p>
<p class='narrow'><<if setup.ENGINE.canDo('TRAIN', 'jog', 5/60, 0.5)>>[[GO FOR A JOG]]<</if>></p>
<p class='narrow'><<if setup.ENGINE.canDo('TRAIN', 'run', 5/60, 0.5)>>[[GO FOR A RUN]]<</if>></p>
<p></p>
<p class='narrow'><<if setup.ENGINE.canDo('TRAIN', 'calisthenics', 5/60, 0.5)>>[[DO CALISTHENICS]]<</if>></p><p class='narrow'><<if setup.ENGINE.canDo('REST', 'sleep', 3) >>[[SLEEP FOR 8 HOURS->SLEEP IN BED]]<</if>></p>
<p class='narrow'><<if setup.ENGINE.canDo('REST', 'sleep', 1) >>[[TAKE A 2 HOUR NAP->TAKE A NAP]]<</if>></p>
<p class='narrow'><<if setup.ENGINE.canDo('REST', 'rest', 15/60) >>[[REST FOR 20 MIN->REST A BIT]]<</if>></p>
<p></p>
<p class='narrow'><<if setup.ENGINE.canDo('EXPLORE', 'search', 30/60) >>[[WALK TO 6 t' 9->GAS STATION]]<</if>></p>
<p class='narrow'><<if setup.ENGINE.canDo('EXPLORE', 'search', 45/60) >>[[WALK TO GYM->GYM]]<</if>></p>
<p class='narrow'><<if setup.ENGINE.canDo('EXPLORE', 'search', 30/60) >>[[WALK TO DINER->DINER]]<</if>></p>
<p></p>
<p class='narrow'><<print setup.ENGINE.carOrCab();>></p>
<p class='narrow'><<if setup.ENGINE.canDo('EXPLORE', 'search', 30/60) >>[[LOOK FOR CHANGE]]<</if>></p>
<p></p>
<p class='narrow'><<if setup.ENGINE.canDo('TRAIN', 'walk', 5/60, 0.5) >>[[GO FOR A WALK]]<</if>></p>
<p class='narrow'><<if setup.ENGINE.canDo('TRAIN', 'jog', 5/60, 0.5) >>[[GO FOR A JOG]]<</if>></p>
<p class='narrow'><<if setup.ENGINE.canDo('TRAIN', 'run', 5/60, 0.5) >>[[GO FOR A RUN]]<</if>></p>
<p></p>
<p class='narrow'><<if setup.ENGINE.canDo('TRAIN', 'aerobics', 5/60, 0.5) >>[[DO AEROBICS]]<</if>></p>
<p class='narrow'><<if setup.ENGINE.canDo('TRAIN', 'calisthenics', 5/60, 0.5) >>[[DO CALISTHENICS]]<</if>></p>
<p class='narrow'><<if setup.ENGINE.canDo('TRAIN', 'yoga', 5/60, 0.5) >>[[DO YOGA]]<</if>></p><p class='narrow'><<if setup.ENGINE.canDo('REST', 'sleep', 3) >>[[SLEEP FOR 5 HOURS->SLEEP IN CAR]]<</if>></p>
<p class='narrow'><<if setup.ENGINE.canDo('REST', 'sleep', 1) >>[[TAKE A 2 HOUR NAP->TAKE A NAP]]<</if>></p>
<p class='narrow'><<if setup.ENGINE.canDo('REST', 'rest', 15/60) >>[[REST FOR 20 MIN->REST A BIT]]<</if>></p>
<p></p>
<p class='narrow'><<if setup.ENGINE.canDo('EXPLORE','drive', 15/60) >>[[DRIVE SOMEWHERE]]<</if>></p><<include 'NAVIGATION'>><<print setup.ENGINE.setupPassage();>><<print setup.ENGINE.beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENGINE.replacePassage();>><<else>>
<<run setup.ENGINE.doRest('sleep', 8); >><<set _time = setup.ENGINE.getTime();>>
<<if ("05:30"<_time)&&(_time<"07:30")>>
<<run setup.ENGINE.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.ENGINE.afterPassage();>>
<<if settings.debugInfo>><p>[encounter: _encounter ]</p><</if>>
<p></p>
<<print setup.ENGINE.exitPassage();>> <<if (_hrs) && (_lv)>>
<<print setup.ENGINE.setupPassage();>><<print setup.ENGINE.beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENGINE.replacePassage();>><<else>>
<<run setup.ENGINE.doWorkout('aerobics', _hrs, _lv); >>
<<replace '#datetime'>><<include 'DATETIME'>><</replace>>
<p><<print setup.ENGINE.descMissing('AEROBIC WORKOUT');>></p>
<p></p>
<</if>>
<<print setup.ENGINE.afterPassage();>>
<<if settings.debugInfo>><p>[encounter: _encounter ]</p><</if>>
<p></p>
<<print setup.ENGINE.exitPassage();>>
<<else>>
<<print setup.ENGINE.workoutTable('aerobics'); >>
<p class='keypress' key='[SPACE]'>[[RETURN->GO HOME]]</p>
<</if>> <<if (_hrs) && (_lv)>>
<<print setup.ENGINE.setupPassage();>><<print setup.ENGINE.beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENGINE.replacePassage();>><<else>>
<<run setup.ENGINE.doWorkout('yoga', _hrs, _lv); >>
<<replace '#datetime'>><<include 'DATETIME'>><</replace>>
<p><<print setup.ENGINE.descMissing('YOGA WORKOUT');>></p>
<p></p>
<</if>>
<<print setup.ENGINE.afterPassage();>>
<<if settings.debugInfo>><p>[encounter: _encounter ]</p><</if>>
<p></p>
<<print setup.ENGINE.exitPassage();>>
<<else>>
<<print setup.ENGINE.workoutTable('yoga'); >>
<p class='keypress' key='[SPACE]'>[[RETURN->GO HOME]]</p>
<</if>>Double-click this passage to edit it.<<set setup.DESC={ /* GAME ENGINE -- everything below this point */
'ht' : function(CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
var ht_desc = '';
switch(true) {
/* 1 inches */ case (CHAR.METRICS.ht < 1): ht_desc = "a bug"; break;
/* 6 inches */ case (CHAR.METRICS.ht < 6): ht_desc = "minuscule"; break;
/* 1 foot */ case (CHAR.METRICS.ht < 12): ht_desc = "tiny"; break;
/* 1 feet, 6 inches */ case (CHAR.METRICS.ht < 18): ht_desc = "little"; break;
/* 2 feet */ case (CHAR.METRICS.ht < 24): ht_desc = "a gnome"; break;
/* 2 feet, 6 inches */ case (CHAR.METRICS.ht < 30): ht_desc = "incredibly short"; break;
/* 3 feet */ case (CHAR.METRICS.ht < 36): ht_desc = "fantastically short"; break;
/* 3 feet, 6 inches */ case (CHAR.METRICS.ht < 42): ht_desc = "spectacularly short"; break;
/* 4 feet */ case (CHAR.METRICS.ht < 48): ht_desc = "exceedingly short"; break;
/* 4 feet, 6 inches */ case (CHAR.METRICS.ht < 54): ht_desc = "very short"; break;
/* 5 feet */ case (CHAR.METRICS.ht < 60): ht_desc = "rather short"; break;
/* 5 feet, 4 inches */ case (CHAR.METRICS.ht < 64): ht_desc = "a bit short"; break;
/* 1 mile */ case (CHAR.METRICS.ht > 63360): ht_desc = "a goddess"; break;
/* 100 feet */ case (CHAR.METRICS.ht > 1200): ht_desc = "a titaness"; break;
/* 75 feet */ case (CHAR.METRICS.ht > 900): ht_desc = "a kaiju"; break;
/* 50 feet */ case (CHAR.METRICS.ht > 600): ht_desc = "ginormous"; break;
/* 35 feet */ case (CHAR.METRICS.ht > 420): ht_desc = "a great giantess"; break;
/* 24 feet */ case (CHAR.METRICS.ht > 288): ht_desc = "a giantess"; break;
/* 13 feet, 4 inches */ case (CHAR.METRICS.ht > 160): ht_desc = "a mini-giantess"; break;
/* 10 feet */ case (CHAR.METRICS.ht > 120): ht_desc = "of Amazonian height"; break;
/* 8 feet, 6 inches */ case (CHAR.METRICS.ht > 102): ht_desc = "monumentally tall"; break;
/* 7 feet, 6 inches */ case (CHAR.METRICS.ht > 90): ht_desc = "spectacularly tall"; break;
/* 7 feet */ case (CHAR.METRICS.ht > 84): ht_desc = "exceedingly tall"; break;
/* 6 feet, 6 inches */ case (CHAR.METRICS.ht > 78): ht_desc = "very tall"; break;
/* 6 feet */ case (CHAR.METRICS.ht > 72): ht_desc = "rather tall"; break;
/* 5 feet, 8 inches */ case (CHAR.METRICS.ht > 68): ht_desc = "a bit tall"; break;
/* 5 feet 4-8 inches */ default: ht_desc = "of average height"; break;
}
return ht_desc;
},
'wt' : function(CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
var wt_desc = '';
/* account for variable-bodymass and percentage bodyfat */
switch(true) {
case (CHAR.METRICS.adj_wt < 0.1): wt_desc = "a few ounces"; break;
case (CHAR.METRICS.adj_wt < 1.0): wt_desc = "a pint"; break;
case (CHAR.METRICS.adj_wt < 10.0): wt_desc = "impossibly thin"; break;
case (CHAR.METRICS.adj_wt < 30.0): wt_desc = "inhumanly thin"; break;
case (CHAR.METRICS.adj_wt < 50.0): wt_desc = "a walking skeleton"; break;
case (CHAR.METRICS.adj_wt < 70.0): wt_desc = "starving"; break;
case (CHAR.METRICS.adj_wt < 85.0): wt_desc = "tiny"; break;
case (CHAR.METRICS.adj_wt < 100.0): wt_desc = "small"; break;
case (CHAR.METRICS.adj_wt < 115.0): wt_desc = "petite"; break;
case (CHAR.METRICS.adj_wt >2200000000.0): wt_desc = "over a megaton"; break;
case (CHAR.METRICS.adj_wt > 220000000.0): wt_desc = "[100 kt+]"; break;
case (CHAR.METRICS.adj_wt > 22000000.0): wt_desc = "[10 kt+]"; break;
case (CHAR.METRICS.adj_wt > 2200000.0): wt_desc = "over a kiloton"; break;
case (CHAR.METRICS.adj_wt > 1000000.0): wt_desc = "[500+ tons]"; break;
case (CHAR.METRICS.adj_wt > 750000.0): wt_desc = "[375+ tons]"; break;
case (CHAR.METRICS.adj_wt > 500000.0): wt_desc = "[250+ tons]"; break;
case (CHAR.METRICS.adj_wt > 250000.0): wt_desc = "[125+ tons]"; break;
case (CHAR.METRICS.adj_wt > 100000.0): wt_desc = "[50+ tons]"; break;
case (CHAR.METRICS.adj_wt > 80000.0): wt_desc = "[40+ tons]"; break;
case (CHAR.METRICS.adj_wt > 65000.0): wt_desc = "[32+ tons]"; break;
case (CHAR.METRICS.adj_wt > 50000.0): wt_desc = "[25+ tons]"; break;
case (CHAR.METRICS.adj_wt > 40000.0): wt_desc = "[20+ tons]"; break;
case (CHAR.METRICS.adj_wt > 30000.0): wt_desc = "[15+ tons]"; break;
case (CHAR.METRICS.adj_wt > 20000.0): wt_desc = "[10+ tons]"; break;
case (CHAR.METRICS.adj_wt > 15000.0): wt_desc = "[7+ tons]"; break;
case (CHAR.METRICS.adj_wt > 10000.0): wt_desc = "[5+ tons]"; break;
case (CHAR.METRICS.adj_wt > 7500.0): wt_desc = "[7500+]"; break;
case (CHAR.METRICS.adj_wt > 5000.0): wt_desc = "[5000+]"; break;
case (CHAR.METRICS.adj_wt > 3500.0): wt_desc = "[3500+]"; break;
case (CHAR.METRICS.adj_wt > 2000.0): wt_desc = "you weight a ton"; break;
case (CHAR.METRICS.adj_wt > 1500.0): wt_desc = "three quarter ton"; break;
case (CHAR.METRICS.adj_wt > 1000.0): wt_desc = "a half ton"; break;
case (CHAR.METRICS.adj_wt > 850.0): wt_desc = "colossal"; break;
case (CHAR.METRICS.adj_wt > 600.0): wt_desc = "enormous"; break;
case (CHAR.METRICS.adj_wt > 500.0): wt_desc = "a quarter ton"; break;
case (CHAR.METRICS.adj_wt > 400.0): wt_desc = "massive"; break;
case (CHAR.METRICS.adj_wt > 350.0): wt_desc = "huge"; break;
case (CHAR.METRICS.adj_wt > 300.0): wt_desc = "big"; break;
case (CHAR.METRICS.adj_wt > 250.0): wt_desc = "bulky"; break;
case (CHAR.METRICS.adj_wt > 200.0): wt_desc = "large"; break;
case (CHAR.METRICS.adj_wt > 165.0): wt_desc = "of solid build"; break;
default: wt_desc = "average weight"; break;
}
return wt_desc;
},
'height' : function(CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
return setup.DESC.ht(CHAR);
},
'weight' : function(CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
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) {}, */
'bicep' : function(CHAR) {
return this.bicep_tone(CHAR) +" "+ this.bicep_size(CHAR);
},
'bicep_tone' : function(CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
var bicep_desc = '';
switch(true) {
case ($GAMEDATA.PC.METRICS.bodyfat < 5): bicep_desc = 'diamond'; break;
case ($GAMEDATA.PC.METRICS.bodyfat < 10): bicep_desc = 'rock-hard'; break;
case ($GAMEDATA.PC.METRICS.bodyfat < 15): bicep_desc = 'solid'; break;
case ($GAMEDATA.PC.METRICS.bodyfat < 20): bicep_desc = 'firm'; break;
case ($GAMEDATA.PC.METRICS.bodyfat < 25): bicep_desc = 'toned'; break;
case ($GAMEDATA.PC.METRICS.bodyfat < 30): bicep_desc = 'smooth'; break;
case ($GAMEDATA.PC.METRICS.bodyfat < 35): bicep_desc = 'soft'; break;
case ($GAMEDATA.PC.METRICS.bodyfat < 40): bicep_desc = 'squishy'; break;
case ($GAMEDATA.PC.METRICS.bodyfat < 45): bicep_desc = 'loose'; break;
case ($GAMEDATA.PC.METRICS.bodyfat < 50): bicep_desc = 'jiggly'; break;
case ($GAMEDATA.PC.METRICS.bodyfat < 60): bicep_desc = 'flabby'; break;
case ($GAMEDATA.PC.METRICS.bodyfat < 70): bicep_desc = 'pudgy'; break;
case ($GAMEDATA.PC.METRICS.bodyfat < 80): bicep_desc = 'fat'; break;
default: bicep_desc = 'bloated'; break;
}
return bicep_desc;
},
'bicep_size' : function(CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
var bi_desc = '';
switch(true) {
case (CHAR.METRICS.bicep > 36): bi_desc = "impossibly large"; break;
case (CHAR.METRICS.bicep > 33): bi_desc = "insane"; break;
case (CHAR.METRICS.bicep > 30): bi_desc = "inhuman"; break;
case (CHAR.METRICS.bicep > 27): bi_desc = "colossal"; break;
case (CHAR.METRICS.bicep > 24): bi_desc = "freakish"; break;
case (CHAR.METRICS.bicep > 21): bi_desc = "tremendous"; break;
case (CHAR.METRICS.bicep > 18): bi_desc = "massive"; break;
case (CHAR.METRICS.bicep > 15): bi_desc = "huge"; break;
case (CHAR.METRICS.bicep > 12): bi_desc = "large"; break;
case (CHAR.METRICS.bicep > 9): bi_desc = "modest"; break;
case (CHAR.METRICS.bicep > 6): bi_desc = "small"; break;
default: bi_desc = "puny"; break;
}
return bi_desc;
},
/* 'legs' : function(CHAR) {}, */
/* 'quads' : function(CHAR) {}, */
/* 'calves' : function(CHAR) {}, */
/* 'forearms' : function(CHAR) {}, */
/* 'delts' : function(CHAR) {}, */
/* 'chest' : function(CHAR) {}, */
/* 'breasts' : function(CHAR) {}, */
/* 'back' : function(CHAR) {}, */
/* 'waist' : function(CHAR) {}, */
/* 'abs' : function(CHAR) {}, */
}>><<set setup.FLAGS={
'DISPLAY':{
'base_metrics' : false,
},
}>><<print setup.ENGINE.setupPassage();>><<print setup.ENGINE.beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENGINE.replacePassage();>><<else>>
<<run setup.ENGINE.doRest('sleep', 120/60); >>
<<run setup.ENGINE.giveFeedback("You take a short nap to recover your strength.");>>
<</if>>
<<print setup.ENGINE.afterPassage();>>
<<if settings.debugInfo>><p>[encounter: _encounter ]</p><</if>>
<p></p>
<<print setup.ENGINE.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'>_P1.name</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>muscle:</td><td>_P1.tone</td> <td>bodyfat:</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>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>STR:</th><th>_P1.str</th> <th>END:</th><th>_P1.end</th> </tr>
<tr> <th colspan='4'><hr/></th> </tr>
</table>
<div class='resources'>
<<print setup.ENGINE.getResource('light', _P1) >>
<<print setup.ENGINE.getResource('dark', _P1) >>
<<print setup.ENGINE.getResource('qi', _P1) >>
<p class='normal'></p>
<<if settings.lod_energyMatrix>>
<div class='energy-matrix half-glass'>
<<print setup.ENGINE.getResource('regen', _P1) >>
<<print setup.ENGINE.getResource('react', _P1) >>
<<print setup.ENGINE.getResource('metab', _P1) >>
<<print setup.ENGINE.getResource('power', _P1) >>
<<print setup.ENGINE.getResource('fight', _P1) >>
<<print setup.ENGINE.getResource('guard', _P1) >>
<<print setup.ENGINE.getResource('vital', _P1) >>
<<print setup.ENGINE.getResource('tough', _P1) >>
<<print setup.ENGINE.getResource('force', _P1) >>
<<print setup.ENGINE.getResource('aware', _P1) >>
<<print setup.ENGINE.getResource('train', _P1) >>
<<print setup.ENGINE.getResource('psych', _P1) >>
<<print setup.ENGINE.getResource('vigor', _P1) >>
<<print setup.ENGINE.getResource('focus', _P1) >>
<<print setup.ENGINE.getResource('skill', _P1) >>
</div>
<</if>>
</div>
<div>
<h4>CONDITION:</h4>
<<print setup.ENGINE.listConditions(_P1); >>
</div><table class=''>
<tr> <td colspan='4'>_P2.name</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>muscle:</td><td>_P2.tone</td> <td>bodyfat:</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>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>STR:</th><th>_P2.str</th> <th>END:</th><th>_P2.end</th> </tr>
<tr> <th colspan='4'><hr/></th> </tr>
</table>
<div class='resources'>
<<print setup.ENGINE.getResource('light', _P2) >>
<<print setup.ENGINE.getResource('dark', _P2) >>
<<print setup.ENGINE.getResource('qi', _P2) >>
<p class='normal'></p>
<<if settings.lod_energyMatrix>>
<div class='energy-matrix half-glass'>
<<print setup.ENGINE.getResource('regen', _P2) >>
<<print setup.ENGINE.getResource('react', _P2) >>
<<print setup.ENGINE.getResource('metab', _P2) >>
<<print setup.ENGINE.getResource('power', _P2) >>
<<print setup.ENGINE.getResource('fight', _P2) >>
<<print setup.ENGINE.getResource('guard', _P2) >>
<<print setup.ENGINE.getResource('vital', _P2) >>
<<print setup.ENGINE.getResource('tough', _P2) >>
<<print setup.ENGINE.getResource('force', _P2) >>
<<print setup.ENGINE.getResource('aware', _P2) >>
<<print setup.ENGINE.getResource('train', _P2) >>
<<print setup.ENGINE.getResource('psych', _P2) >>
<<print setup.ENGINE.getResource('vigor', _P2) >>
<<print setup.ENGINE.getResource('focus', _P2) >>
<<print setup.ENGINE.getResource('skill', _P2) >>
</div>
<</if>>
</div>
<div>
<h4>CONDITION:</h4>
<<print setup.ENGINE.listConditions(_P2); >>
</div><<if false && ( _P1.LIMBS.ARMS.pct<=0 && _P1.LIMBS.LEGS.pct<=0 && _P1.LIMBS.CORE.pct<=0 )>>
<div class='action' title='this isn't good...'>
<<link 'PRAY'>>
<<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.ENGINE.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.ENGINE.darkAdd(10000, _P1); } >>
<<print setup.ENGINE.combatRefresh();>>
<</link>>
</div>
<</if>>
<<if !_P1.stun && !_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.ENGINE.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.ENGINE.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.ENGINE.darkAdd(10000, _P1); } >>
<<print setup.ENGINE.combatRefresh();>>
<</link>>
<<else>>
<a title='you're arms are too badly damaged to punch...' class='disabled'>PUNCH</a>
<</if>>
</div>
<</if>>
<<if !_P1.stun && !_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.ENGINE.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.ENGINE.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.ENGINE.darkAdd(10000, _P1); } >>
<<print setup.ENGINE.combatRefresh();>>
<</link>>
<<else>>
<a title='you're legs are too badly damaged to kick...' class='disabled'>KICK</a>
<</if>>
</div>
<</if>>
<<if !_P1.stun && !_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.ENGINE.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.ENGINE.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.ENGINE.darkAdd(10000, _P1); } >>
<<print setup.ENGINE.combatRefresh();>>
<</link>>
<<else>>
<a title='you're arms are too badly damaged to slap...' class='disabled'>SLAP</a>
<</if>>
</div>
<</if>>
<<if !_P1.stun && !_P2.gone && !_P1.escaped && !_P2.escaped>>
<div class='action keypress' key='4' title='daze them...'>
<<if _P1.LIMBS.CORE.pct>0>>
<<link '[TEST: HEADBUTT]'>>
<<set _round++; >>
<<prepend '#combat_log'>>
<div class='btl_evt'>
<div class='btl_msg'><<set _ACT1=setup.ENGINE.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.ENGINE.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.ENGINE.darkAdd(10000, _P1); } >>
<<print setup.ENGINE.combatRefresh();>>
<</link>>
<<else>>
<a title='you're core is too badly damaged to headbutt...' class='disabled'>[TEST: HEADBUTT]</a>
<</if>>
</div>
<</if>>
<<if !_P1.stun && !_P2.gone && !_P1.escaped && !_P2.escaped>>
<div class='action keypress' key='5' title='take a moment...'>
<<if ( _P2.stun || _P2.dead || _P1.LIMBS.ARMS.pct<=0 )>>
<<link 'REST'>>
<<set _round++; >>
<<prepend '#combat_log'>>
<div class='btl_evt'>
<div class='btl_msg'><<set _ACT1=setup.ENGINE.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.ENGINE.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.ENGINE.darkAdd(10000, _P1); } >>
<<print setup.ENGINE.combatRefresh();>>
<</link>>
<<else>>
<<link 'GUARD'>>
<<set _round++; >>
<<prepend '#combat_log'>>
<div class='btl_evt'>
<div class='btl_msg'><<set _ACT1=setup.ENGINE.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.ENGINE.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.ENGINE.darkAdd(10000, _P1); } >>
<<print setup.ENGINE.combatRefresh();>>
<</link>>
<</if>>
</div>
<</if>>
<<if !_P1.stun && !_P2.gone && !_P1.escaped && !_P2.escaped>>
<div class='action' title='must escape...'>
<<if _P1.LIMBS.LEGS.pct>0 && _P1.LIMBS.CORE.pct>0 && !_P2.stun>>
<<link '[TEST: FLEE]'>>
<<set _round++; >>
<<prepend '#combat_log'>>
<div class='btl_evt'>
<div class='btl_msg'><<set _ACT1=setup.ENGINE.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.ENGINE.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.ENGINE.darkAdd(10000, _P1); } >>
<<print setup.ENGINE.combatRefresh();>>
<</link>>
<<elseif _P2.stun>>
<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 (_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.ENGINE.darkAdd(1, _P1); >>
<</link>>
<<else>>
<a title='...' class='disabled'>DEMAND APOLOGY</a>
<</if>>
</div>
<</if>>
<<if (_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.ENGINE.darkAdd(10, _P1); >>
<</link>>
<<else>>
<a title='...' class='disabled'>DEMAND TRIBUTE</a>
<</if>>
</div>
<</if>>
<<if (_P2.stun || _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.ENGINE.lightAdd(-(100+(_cash*3)), $GAMEDATA.PC);
$GAMEDATA.PC.MATRIX.money += _cash;
$GAMEDATA.PC.JUNK['wallet-'+Date.now()] = _wallet;
$GAMEDATA.PC.JUNK[_LICENSE.cardtype+'-'+Date.now()] = _LICENSE.name + ''s ' + _LICENSE.cardtype +
' (' + _LICENSE.gender + ' age ' + _LICENSE.age +
", "+setup.ENGINE.formatHeight(_LICENSE.ht)+
", "+setup.ENGINE.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.stun || _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.ENGINE.lightAdd(-(100+(_cash*3)), $GAMEDATA.PC);
$GAMEDATA.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.stun || _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.ENGINE.lightAdd(-3000, _P1);
setup.ENGINE.takeHome(_P2);
_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 (_P2.stun || _P2.dead) && !_P2.gone && !_P1.escaped && !_P2.escaped>>
<div class='action'>
<<if !_P2.dead && ( _P2.STATS.max_qi>30 || ( _P2.METRICS.ht>1 && settings.mac_heightGain ) ) && _P1.MATRIX.dark>=(_P1.STATS.caliber*_P1.STATS.level) >>
<<link '[TEST: FEED]'>>
<<run setup.ENGINE.combatDrain(_P1, _P2, 'beta'); setup.ENGINE.darkSpend(_P1.STATS.caliber*_P1.STATS.level, _P1); >>
<<prepend '#combat_log'>><div class='btl_evt'>
<div class='btl_msg'><span class='hit_msg'>You drained _P2.name, taking <<print setup.ENGINE.his_her(_P2.gender);>> power as your own.</span></div>
<div class='btl_msg'><span class='cnd_msg'>
<<if _P2.dead>>
The drain was more than <<print setup.ENGINE.his_her(_P2.gender);>> weakened body could handle, there's simply nothing left to take.
<<run
if(!_hasKilled && _P2.dead) {
_hasKilled=true;
setup.ENGINE.darkAdd(10000, _P1);
}
>>
<<else>>
Well, <<print setup.ENGINE.he_she(_P2.gender);>>'s a bit smaller than before, but it looks like <<print setup.ENGINE.he_she(_P2.gender);>>'ll probably survive...
<</if>>
</span></div>
</div><</prepend>>
<<print setup.ENGINE.combatRefresh();>>
<</link>>
<<elseif (_P1.MATRIX.dark<(_P1.STATS.caliber*_P1.STATS.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 (_P2.stun || _P2.dead) && !_P2.gone && !_P1.escaped && !_P2.escaped>>
<div class='action'>
<<if _P1.MATRIX.focus>1 && (_P1.MATRIX.qi/_P1.STATS.max_qi>0.10)>>
<<link '[TEST: HEAL]'>>
<<run setup.ENGINE.combatHeal(_P1, _P2, 'beta'); setup.ENGINE.lightSpend(_P1.STATS.caliber*_P1.STATS.level, _P1); >>
<<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.ENGINE.his_her(_P2.gender);>> wounds begin to close...</span></div>
<div class='btl_msg'><span class='cnd_msg'>
<<if Math.random()<(setup.ENGINE.sqrt(_P1.STATS.caliber, '+')*setup.ENGINE.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.ENGINE.wildSurge(_P1, _P2); >>
<<run
setup.ENGINE.do_status_update(_P2); setup.ENGINE.refresh_fighter_info(_P2);
setup.ENGINE.do_status_update(_P1); setup.ENGINE.refresh_fighter_info(_P1);
>>
<<else>>
<<if (_P2.dead && (setup.ENGINE.charTempVar(_P2, 'newQi')>(_P2.STATS.max_qi/3)))>>
Unbelievably, you manage to stabley channel enough raw primal essence to completely restore _P2.name_first back to life.
<<run
setup.ENGINE.combatRevive(_P1, _P2, 'beta');
setup.ENGINE.refresh_fighter_info(_P2);
setup.ENGINE.refresh_fighter_info(_P1);
if(!_hasRaised) {
_hasRaised=true;
setup.ENGINE.lightAdd(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.ENGINE.his_her(_P2.gender);>> body were strong enough to get <<print setup.ENGINE.him_her(_P2.gender);>> back on <<print setup.ENGINE.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.ENGINE.combatRefresh();>>
<</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.stun || _P2.dead) && !_P1.escaped && !_P2.escaped>><div class='action'><<link 'LEAVE'>><<run
if(_P2.dead || _P2.kidnapped) { setup.ENGINE.enemyForget(_P2); }
setup.ENGINE.showSideBar();
setup.ENGINE.giveFeedback('An exhilarating fight! You did well.');
setup.ENGINE.powerTransfer(_P2, _P1, 0.034);
$GAMEDATA.WORLD.girlPower+=0.01;
>><<goto 'GO HOME'>><</link>></div><</if>>
<<if _P1.stun && !_P1.escaped && !_P2.escaped>><div class='action' title='not good...'><<link 'CONTINUE'>><<run
setup.ENGINE.enemyRemember(_P2);
setup.ENGINE.slaveFree(_P2.uid||_P2.name); _P2.kidnapped=false;
setup.ENGINE.levelAdd(Math.min(_P1.STATS.caliber*3, _P1.STATS.level*0.03), _P2);
setup.ENGINE.levelAdd(-Math.min(_P1.STATS.caliber*3, _P1.STATS.level*0.03), _P1);
(_P1.MATRIX.money) && (_P1.MATRIX.money*=0.9);
setup.ENGINE.refresh_fighter_info(_P1);
setup.ENGINE.refresh_fighter_info(_P2);
setup.ENGINE.showSideBar();
setup.ENGINE.giveFeedback('you were defeated' + (_P1.dead ? '... and killed.' : ', somehow you made it back home...'));
$GAMEDATA.WORLD.girlPower+=(_P2.gender=='male' ? -0.01 : 0.01);
_P1.stun=false;
>><<goto 'GO HOME'>><</link>></div><</if>>
<<run setup.ENGINE.trim_combatLog();>>
<<if _P1.escaped || _P2.escaped>><div class='action' title='escaped...'><<link 'CONTINUE'>><<run
setup.ENGINE.enemyRemember(_P2);
_P2.kidnapped=false;
setup.ENGINE.slaveFree(_P2.uid||_P2.name); _P2.kidnapped=false;
setup.ENGINE.showSideBar();
if(_P1.escaped) {
setup.ENGINE.giveFeedback('you ran away...' +(_P1.MATRIX.vigor<1 ? ' you still feel your lungs burning- perhaps you should rest a bit.' : ''));
$GAMEDATA.WORLD.girlPower+=(_P2.gender=='male' ? -0.01 : 0.01);
} else {
setup.ENGINE.giveFeedback(_P2.name_first +' ran away... wonder what scared '+ setup.ENGINE.him_her(_P2.gender) +' so?');
$GAMEDATA.WORLD.girlPower+=0.01;
}
_P1.escaped=false; _P2.escaped=false;
>><<goto 'GO HOME'>><</link>></div><</if>>
<<run setup.ENGINE.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||$GAMEDATA.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||$GAMEDATA.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||$GAMEDATA.PC; return true; } },
/* END setup.ACTIONS.REST */ }>><div class='fill'>
<div>
<h1>GAME OVER</h1>
<p id='CoD'><<print $GAMEDATA.PC.NAMES.first +' '+ setup.ENGINE.causeOfDeath($GAMEDATA.PC) +"<br/> on "+ setup.ENGINE.getLongDate() + "<br/> at "+setup.ENGINE.getTime('12');>></p>
<p id='Epitaph'><<print setup.ENGINE.write_epitaph($GAMEDATA.PC);>></p>
<<run setup.ENGINE.showSideBar();>>
</div>
</div><<if !_slave>>
<br/><br/><br/><br/><br/>
<div class='slaves'><<print setup.ENGINE.listSlaves($GAMEDATA.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.ENGINE.menuHide();
>>
<</link>></p>
<<else>>
<div class='slaves'><<print setup.ENGINE.slaveInteractions(_slave, $GAMEDATA.PC);>></div>
<p></p>
<p></p>
<p class='keypress' key='[ESC]'><<link 'RETURN'>>
<<unset _slave>>
<<run setup.ENGINE.menuShow('slaves');>>
<</link>></p>
<</if>><<set _time=setup.ENGINE.getTime('24'); >>
<<replace '#datetime'>><<include 'DATETIME'>><</replace>>
<<if (_time>'06:59')&&(_time<'22:00') >>
<<if !_section>>
<<print setup.ENGINE.setupPassage();>><<print setup.ENGINE.beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENGINE.replacePassage();>><<else>>
<h2>WELCOME TO THE GYM</h2>
<p><<linkreplace 'DESK'>>
As you approach, you are greeted by a <<print setup.ENGINE.abFlicker('cute', ' cat '); >> girl with a warm smile.
According to the nameplate, she's Katie, the desk <<print setup.ENGINE.abFlicker('clerk. ', 'cleric.'); >>
She sets down the box of <<print setup.ENGINE.abFlicker('necco', ' neko '); >> wafers and says,
"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", she smiles and winks at you.
<<print setup.ENGINE.run_abFlicker();>>
<</linkreplace>></p>
<p><<link 'WORKOUT'>><<set _section='workout'>><<print setup.ENGINE.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.ENGINE.listMuscleStatus();>><</linkappend>></p>
<</if>>
<<print setup.ENGINE.afterPassage();>>
<<if settings.debugInfo>><p>[encounter: _encounter ]</p><</if>>
<p></p>
<<print setup.ENGINE.exitPassage();>>
<<else>>
<<switch _section>>
<<case 'workout'>>
<<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.ENGINE.reloadPassage(); >><</link>></p>
<p class='keypress' key='2'><<link 'CLASSES' >><<set _area='class' >><<print setup.ENGINE.reloadPassage(); >><</link>></p>
<p class='keypress' key='3'><<link 'CARDIO MACHINES' >><<set _area='cardio' >><<print setup.ENGINE.reloadPassage(); >><</link>></p>
<p class='keypress' key='4'><<link 'PT AREA' >><<set _area='pt bars' >><<print setup.ENGINE.reloadPassage(); >><</link>></p>
<p class='keypress' key='5'><<link 'CROSSFIT' >><<set _area='crossfit' >><<print setup.ENGINE.reloadPassage(); >><</link>></p>
<p class='keypress' key='6'><<link 'LIFT STATIONS' >><<set _area='lifts' >><<print setup.ENGINE.reloadPassage(); >><</link>></p>
<p class='keypress' key='[ESC]'><<link 'RETURN'>><<unset _section>><<print setup.ENGINE.reloadPassage();>><</link>></p>
<<else>>
<<if !_workout>>
<<print setup.ENGINE.gym_listWorkoutsForArea(_area, $GAMEDATA.PC); >>
<p class='keypress' key='[ESC]'><<link 'RETURN'>><<unset _area>><<print setup.ENGINE.reloadPassage();>><</link>></p>
<<else>>
<<if !_load>>
_workout
<<print setup.ENGINE.gym_listLoadsForWorkout(_workout);>>
<p class='keypress' key='[ESC]'><<link 'RETURN'>><<unset _workout>><<print setup.ENGINE.reloadPassage();>><</link>></p>
<<else>>
<<print setup.ENGINE.doLift(_workout, _weight, _bonus, $GAMEDATA.PC);>>
<p class='keypress' key='[ESC]'><<link 'RETURN'>><<unset _load>><<print setup.ENGINE.reloadPassage();>><</link>></p>
<</if>>
<</if>>
<</if>>
<</switch>>
<</if>>
<<else>>
<<print setup.ENGINE.setupPassage();>><<print setup.ENGINE.beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENGINE.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.ENGINE.exitPassage();>></div>
<</if>>
<</if>><<print setup.ENGINE.setupPassage();>><<print setup.ENGINE.beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENGINE.replacePassage();>><<else>>
<h2>DINER</h2>
<p>WAIT TO BE SEATED</p>
<p>RESTROOM</p>
<</if>>
<<print setup.ENGINE.afterPassage();>>
<<if settings.debugInfo>><p>[encounter: _encounter]</p><</if>>
<p></p>
<<print setup.ENGINE.exitPassage();>><<print setup.ENGINE.setupPassage();>><<print setup.ENGINE.beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENGINE.replacePassage();>><<else>>
<h2>GAS STATION</h2>
<p>buy gas</p>
<p>get snacks</p>
<</if>>
<<print setup.ENGINE.afterPassage();>>
<<if settings.debugInfo>><p>[encounter: _encounter]</p><</if>>
<p></p>
<<print setup.ENGINE.exitPassage();>><<print setup.ENGINE.setupPassage();>><<print setup.ENGINE.beforePassage();>>
<<if setup.ENCOUNTERS[_encounter].replace>><<print setup.ENGINE.replacePassage();>><<else>>
<h2>MOTEL</h2>
<p>check in/out</p>
<p>go to room</p>
<</if>>
<<print setup.ENGINE.afterPassage();>>
<<if settings.debugInfo>><p>[encounter: _encounter]</p><</if>>
<p></p>
<<print setup.ENGINE.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.ENGINE.canDo('EXPLORE', 'search', 1/60); }, },
'equip' :{ 'passage':'EQUIP' , 'short':'Clothing' , 'long':'CHANGE CLOTHES' , 'key':'C' , 'icon':'' , 'show':function() { return true && setup.ENGINE.canDo('EXPLORE', 'search', 1/60); }, },
'stuff' :{ 'passage':'STUFF' , 'short':'Stuff' , 'long':'USE SOMETHING' , 'key':'G' , 'icon':'' , 'show':function() { return true && setup.ENGINE.canDo('EXPLORE', 'search', 1/60); }, },
'self' :{ 'passage':'SELF' , 'short':'Self' , 'long':'EXAMINE SELF' , 'key':'V' , 'icon':'' , 'show':function() { return true && setup.ENGINE.canDo('EXPLORE', 'search', 1/60); }, },
'slaves' :{ 'passage':'SLAVES' , 'short':'Slaves' , 'long':'CHECK SLAVES' , 'key':'B' , 'icon':'' , 'show':function() { return (Object.keys($GAMEDATA.PC.SLAVES).length>0) && setup.ENGINE.canDo('EXPLORE', 'search', 1/60); }, },
'powers' :{ 'passage':'POWERS' , 'short':'Powers' , 'long':'DEVELOP POWERS' , 'key':'X' , 'icon':'' , 'show':function() { return true && setup.ENGINE.canDo('EXPLORE', 'search', 1/60); }, },
/* 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.ENGINE.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><<set setup.CHARS['Lisa Irons'] = {
'NAMES': {
'first' : "Lisa",
'full' : "Lt. Lisa Victoria Irons III",
'birth' : "Alyssindra Victoria Irons III",
},
'TRAITS':{
'gender' : "female",
'species' : "human",
/* 'skin_type' : "", */
/* 'skin_color' : "", */
/* 'skin_condition' : "", */
/* 'hair_length' : "", */
/* 'hair_color' : "", */
/* 'hair_style' : "", */
/* 'hair_condition' : "", */
/* 'eye_color' : "", */
/* 'eye_condition' : "", */
/* 'face' : "", */
},
'PASSAGES':{
'start' : "START LISA",
'home' : "LIVING ON STREET",
'travel' : "WALK SOMEWHERE",
},
'STATS':{
/* PRIMARY STATS - used to calc maxes for secondary stats */
'STR' : 120.00,
'END' : 120.00,
'SPD' : 120.00,
'PHY' : 120.00,
'INS' : 120.00,
'WSD' : 120.00,
'level' : 120.00,
'caliber' : 15.00,
'workout_hrs': 100.00,
'karmic_well': 10000.00,
},
'MATRIX':{
/* SECONDARY STATS/ENERGY - current values (renewable resources) */
'tough' : 3400.0, /* STRxEND - [P] resistance to damage */
'power' : 16000.0, /* STRxSPD - [P] physical force/lift */
'vigor' : 13000.0, /* STRxPHY - [P] stamina */
'skill' : 7100.0, /* STRxINS - [H] precision/accuracy */
'train' : 8000.0, /* STRxWSD - [H] discipline/training */
'regen' : 7400.0, /* ENDxSPD - [P] regeneration/healing */
'vital' : 5600.0, /* ENDxPHY - [P] health */
'force' : 5200.0, /* ENDxINS - [H] force of will */
'guard' : 6300.0, /* ENDxWSD - [H] active defense */
'metab' : 4700.0, /* SPDxPHY - [P] metabolism */
'fight' : 6600.0, /* SPDxINS - [H] offensive speed/action time */
'react' : 3100.0, /* SPDxWSD - [H] defensive speed/reaction time */
'focus' : 2800.0, /* PHYxINS - [H] attention to detail */
'aware' : 4400.0, /* PHYxWSD - [H] alertness to environment */
'psych' : 2300.0, /* INSxWSD - [M] psionic energy */
/* RESOURCES - (non-stat/non-renewable) */
'light' : 7000.00, /* ? unit */
'dark' : 5000.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' : 84.0, /* height, inches */
'ht' : 84.0, /* height, inches */
'wt' : 340.0, /* weight, pounds */
'adj_wt' : 340.0, /* adjusted weight, pounds */
'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' : "C", /* */
'waist' : 42.0, /* */
'hips' : 54.0, /* */
'BMI' : null, /* */
'bodyfat' : null, /* */
},
'STATUS':{},
'STUFF':{
/* ID:uses */
/* did not arrive with clothing... or any posessions */
},
'EQUIP':{
/* SLOT:ID */
/* did not arrive with clothing... or any posessions */
},
'PROPERTY':{
/* no car */
},
'STATE':{
'saveVersion' : 0.2,
'feedbackQueue' : [],
'Date' : new Date(),
'lastPassage' : null,
'lastExercise' : null,
'lastActivity' : null,
'lastAction' : null,
'lastItem' : null,
},
'SLAVES':{},
'ENEMIES':{},
'FRIENDS':{},
'LOVERS':{},
'POWERS':{
'Super-Strength':{
'level':15.0,
'max':20.0,
'locked':false,
'hidden':false,
},
'Super-Endurance':{
'level':10.0,
'max':10.0,
'locked':false,
'hidden':false,
},
},
'SKILLS':{},
'DEVICES':{},
'BODY':{
'Calves' :{ 'train':15.0, 'damage':0.0, },
'Quads' :{ 'train':15.0, 'damage':0.0, },
'Hams' :{ 'train':15.0, 'damage':0.0, },
'Glutes' :{ 'train':15.0, 'damage':0.0, },
'Hips' :{ 'train':15.0, 'damage':0.0, },
'LoBack' :{ 'train':15.0, 'damage':0.0, },
'Lats' :{ 'train':15.0, 'damage':0.0, },
'Traps' :{ 'train':15.0, 'damage':0.0, },
'Abs' :{ 'train':15.0, 'damage':0.0, },
'Pecs' :{ 'train':15.0, 'damage':0.0, },
'Delts' :{ 'train':15.0, 'damage':0.0, },
'LeftTri' :{ 'train':15.0, 'damage':0.0, },
'RightTri' :{ 'train':15.0, 'damage':0.0, },
'LeftBi' :{ 'train':15.0, 'damage':0.0, },
'RightBi' :{ 'train':15.0, 'damage':0.0, },
'LeftFore' :{ 'train':15.0, 'damage':0.0, },
'RightFore' :{ 'train':15.0, 'damage':0.0, },
'LeftGrip' :{ 'train':15.0, 'damage':0.0, },
'RightGrip' :{ 'train':15.0, 'damage':0.0, },
'Cardio' :{ 'train':15.0, 'damage':0.0, },
'Kegel' :{ 'train':15.0, 'damage':0.0, },
'Brain' :{ 'train':15.0, 'damage':0.0, },
},
'IS':{},
'BS':{},
'ES':{},
'EQ':{},
/* END setup.CHARS['Tammi X'] */ }>><p class='narrow'><<if setup.ENGINE.canDo('REST', 'sleep', 1) >>[[TAKE A 2 HOUR NAP->TAKE A NAP]]<</if>></p>
<p class='narrow'><<if setup.ENGINE.canDo('REST', 'rest', 15/60) >>[[REST FOR 20 MIN->REST A BIT]]<</if>></p>
<p></p>
<p class='narrow'><<if setup.ENGINE.canDo('TRAIN', 'walk', 120/60) >>[[WALK SOMEWHERE]]<</if>></p>
<p class='narrow'><<if setup.ENGINE.canDo('EXPLORE', 'search', 30/60) >>[[LOOK FOR CHANGE]]<</if>></p>
<p></p>
<p class='narrow'><<if setup.ENGINE.canDo('TRAIN', 'walk', 5/60, 0.5) >>[[GO FOR A WALK]]<</if>></p>
<p class='narrow'><<if setup.ENGINE.canDo('TRAIN', 'jog', 5/60, 0.5) >>[[GO FOR A JOG]]<</if>></p>
<p class='narrow'><<if setup.ENGINE.canDo('TRAIN', 'run', 5/60, 0.5) >>[[GO FOR A RUN]]<</if>></p>
<p></p>
<p class='narrow'><<if setup.ENGINE.canDo('TRAIN', 'calisthenics', 5/60, 0.5) >>[[DO CALISTHENICS]]<</if>></p><<include 'NAVIGATION'>><p class='narrow keypress' key='1'>[[GAS STATION]]</p>
<p class='narrow keypress' key='2'><<link 'GYM'>><<set $GAMEDATA.WORLD.girlPower += 0.1;>><<goto 'GYM'>><</link>></p>
<p class='narrow keypress' key='3'>[[MOTEL]]</p>
<p class='narrow keypress' key='4'>[[DINER]]</p>
<p class='narrow keypress' key='5'>[[S-MART->SHOP S-MART]]</p>
<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.ENGINE.listPowers($GAMEDATA.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.ENGINE.menuHide();
>>
<</link>></p>
<<else>>
<div class='powers'><<print setup.ENGINE.developPower(_power, $GAMEDATA.PC);>></div>
<p></p>
<p></p>
<p class='keypress' key='[ESC]'><<link 'RETURN'>>
<<unset _power>>
<<run setup.ENGINE.menuShow('powers');>>
<</link>></p>
<</if>><<set setup.POWERS={
/* END setup.POWERS */ }>><div class='left framed'>
<h4>STATS / ENERGY</h4>
<table class='stats' style='font-size: 0.9em;'>
<tr> <th><<print setup.ENGINE.karmic_link('SPD')>>:</th> <th><<print setup.ENGINE.statPrint('SPD', $GAMEDATA.PC); >></th> </tr>
<tr> <th><<print setup.ENGINE.karmic_link('END')>>:</th> <th><<print setup.ENGINE.statPrint('END', $GAMEDATA.PC); >></th> </tr>
<tr> <th><<print setup.ENGINE.karmic_link('WSD')>>:</th> <th><<print setup.ENGINE.statPrint('WSD', $GAMEDATA.PC); >></th> </tr>
<tr> <th><<print setup.ENGINE.karmic_link('PHY')>>:</th> <th><<print setup.ENGINE.statPrint('PHY', $GAMEDATA.PC); >></th> </tr>
<tr> <th><<print setup.ENGINE.karmic_link('STR')>>:</th> <th><<print setup.ENGINE.statPrint('STR', $GAMEDATA.PC); >></th> </tr>
<tr> <th><<print setup.ENGINE.karmic_link('INS')>>:</th> <th><<print setup.ENGINE.statPrint('INS', $GAMEDATA.PC); >></th> </tr>
<tr class='spacer'><td colspan='2'><hr /></td></tr>
<tr style='font-size: 0.75em'> <td>lv [cal]:</td> <td><<print ($GAMEDATA.PC.STATS.level).toFixed(0)+" ["+($GAMEDATA.PC.STATS.caliber).toFixed(0)+"]">></td> </tr>
<tr class='spacer'><td colspan='2'><hr /></td></tr>
<tr> <td>Bodyfat:</td> <td><<print setup.ENGINE.char_metric('bodyfat')>></td> </tr>
<tr> <td>Muscle:</td> <td><<print setup.ENGINE.char_metric('bodytone')>></td> </tr>
</table>
<hr />
<div class='resources'>
<<print setup.ENGINE.getResource('light') >>
<<print setup.ENGINE.getResource('dark') >>
<<print setup.ENGINE.getResource('qi') >>
<hr />
<<if settings.lod_energyMatrix>>
<div class='energy-matrix half-glass'>
<<print setup.ENGINE.getResource('regen') >>
<<print setup.ENGINE.getResource('react') >>
<<print setup.ENGINE.getResource('metab') >>
<<print setup.ENGINE.getResource('power') >>
<<print setup.ENGINE.getResource('fight') >>
<<print setup.ENGINE.getResource('guard') >>
<<print setup.ENGINE.getResource('vital') >>
<<print setup.ENGINE.getResource('tough') >>
<<print setup.ENGINE.getResource('force') >>
<<print setup.ENGINE.getResource('aware') >>
<<print setup.ENGINE.getResource('train') >>
<<print setup.ENGINE.getResource('psych') >>
<<print setup.ENGINE.getResource('vigor') >>
<<print setup.ENGINE.getResource('focus') >>
<<print setup.ENGINE.getResource('skill') >>
</div>
<</if>>
</div>
<div>
<h4>CONDITION:</h4>
<<print setup.ENGINE.listConditions(); >>
</div>
</div>Double-click this passage to edit it.<<set
/* Content-build for X-Website... */
setup.ENGINE.contentSite = 'deviantArt';
/* deviantArt allows nudity, but no sexual acts */
>><<run
setup.ENGINE.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', 'Lisa Irons', 'Play as Slave']`>></li>
<li><<topic 'STATS' >><<subtopics `['SPD', 'END', 'WSD', 'PHY', 'STR', 'INS']`>></li>
<li><<topic 'ENERGY' >><<subtopics `['regen', 'react', 'metab', 'power', 'fight', 'guard', 'vital', 'tough', 'force', 'aware', 'train', 'psych', 'vigor', 'focus', 'skill']`>></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 class='disabled'><<topic 'POWERS' >><<subtopics `[]`>></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.ENGINE.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>From a documentation standpoint: everything, but specifically with the current build version: this guide. (and some tweaks and rebalances)</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>
</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- for now it is best to say she starts off with stats of 120, and a body-weight of 340 pounds, which even without powers means she has the lifting strength of over 200 men and can kill an entire swat team with a single punch. Once she has access to her Super-Strength and Super-Endurance powers she will be nigh unstoppable. Until then she'll have to settle for throwing cars a measly 100 feet.)</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>"Aunt Kathy"</li>
<li>Ninjafirevax</li>
<li>Martin Schröder</li>
<li>Araktosh</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. Its 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'>> and <<topic 'Tammi X'>> 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>
<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>
<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 'Lisa Irons' >>
<p>[<sss><<topic 'PLAYABLE CHARACTERS'>> > _topic</sss>]</p>
<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 SPD'><<topic 'SPD'>></span> (Speed) - the rate at which you experience time and can act</p>
<p><span class='statval END'><<topic 'END'>></span> (Endurance) - your level of resiliance</p>
<p><span class='statval WSD'><<topic 'WSD'>></span> (Wisdom) - your ability to avoid harm/change</p>
<p><span class='statval PHY'><<topic 'PHY'>></span> (Physique) - your level of fitness</p>
<p><span class='statval STR'><<topic 'STR'>></span> (Strength) - your level of muscle</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 '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 '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 '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 '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 '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 '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 'ENERGY' >>
<p>[<sss>_topic</sss>]</p>
<p>...<<topic ''>>...</p>
<p><<topic 'Qi'>> </p>
<p>...<<topic ''>>...</p>
<p><<topic 'regen'>> </p>
<p><<topic 'react'>> </p>
<p><<topic 'metab'>> </p>
<p><<topic 'power'>> </p>
<p><<topic 'fight'>> </p>
<p><<topic 'guard'>> </p>
<p><<topic 'vital'>> </p>
<p><<topic 'tough'>> </p>
<p><<topic 'force'>> </p>
<p><<topic 'aware'>> </p>
<p><<topic 'train'>> </p>
<p><<topic 'psych'>> </p>
<p><<topic 'vigor'>> </p>
<p><<topic 'focus'>> </p>
<p><<topic 'skill'>> </p>
<p>...<<topic ''>>...</p>
<<case 'regen' >>
<p>[<sss><<topic 'ENERGY'>> > _topic</sss>]</p>
<p>Regeneration (<span class='statval SPD'><<topic 'SPD'>></span> x <span class='statval END'><<topic 'END'>></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 'SPD'>> and/or <<topic 'END'>>. Taking damage. Working out. Running/Jogging.</p>
<p>Combat role: improves recovery during the <<topic 'Guard Action'>> / <<topic 'Rest Action'>>.</p>
<<case 'react' >>
<p>[<sss><<topic 'ENERGY'>> > _topic</sss>]</p>
<p>Reaction (<span class='statval SPD'><<topic 'SPD'>></span> x <span class='statval WSD'><<topic 'WSD'>></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 'SPD'>> and/or <<topic 'WSD'>>. 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 'metab' >>
<p>[<sss><<topic 'ENERGY'>> > _topic</sss>]</p>
<p>Metabolism (<span class='statval SPD'><<topic 'SPD'>></span> x <span class='statval PHY'><<topic 'PHY'>></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 'SPD'>> and/or <<topic 'PHY'>>. Fighting. Working out. Running/Jogging.</p>
<p>Combat role: None yet, though it does aid in energy and damage recovery.</p>
<<case 'power' >>
<p>[<sss><<topic 'ENERGY'>> > _topic</sss>]</p>
<p>Power (<span class='statval SPD'><<topic 'SPD'>></span> x <span class='statval STR'><<topic 'STR'>></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 'SPD'>> and/or <<topic 'STR'>>. 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 'fight' >>
<p>[<sss><<topic 'ENERGY'>> > _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 'guard' >>
<p>[<sss><<topic 'ENERGY'>> > _topic</sss>]</p>
<p>Guard (<span class='statval END'><<topic 'END'>></span> x <span class='statval WSD'><<topic 'WSD'>></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 'END'>> and/or <<topic 'WSD'>>. Being attacked. Working out.</p>
<p>Combat role: Defense/Crit-Guard - prevents opponent from scoring critical hits (vs enemy <<topic 'skill'>> energy), and improves chance to counter-attack. Even more effective when the <<topic 'Guard Action'>> is selected.</p>
<<case 'vital' >>
<p>[<sss><<topic 'ENERGY'>> > _topic</sss>]</p>
<p>Vitality (<span class='statval END'><<topic 'END'>></span> x <span class='statval PHY'><<topic 'PHY'>></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 'END'>> and/or <<topic 'PHY'>>. 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 'tough' >>
<p>[<sss><<topic 'ENERGY'>> > _topic</sss>]</p>
<p>Toughness (<span class='statval END'><<topic 'END'>></span> x <span class='statval STR'><<topic 'STR'>></span>)</p>
<p>Resistance to damage and pain. If your toughness breaks before your foes, its 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 'END'>> and/or <<topic 'STR'>>. 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 'force' >>
<p>[<sss><<topic 'ENERGY'>> > _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 'aware' >>
<p>[<sss><<topic 'ENERGY'>> > _topic</sss>]</p>
<p>Awareness/Enlightenment (<span class='statval WSD'><<topic 'WSD'>></span> x <span class='statval PHY'><<topic 'PHY'>></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 'WSD'>> and/or <<topic 'PHY'>>. 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 'train' >>
<p>[<sss><<topic 'ENERGY'>> > _topic</sss>]</p>
<p>Training (<span class='statval WSD'><<topic 'WSD'>></span> x <span class='statval STR'><<topic 'STR'>></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 'WSD'>> and/or <<topic 'STR'>>. Fighting. Working out. Calisthenics.</p>
<p>Combat role: Currently only used to improve chance to flee/elude capture.</p>
<<case 'psych' >>
<p>[<sss><<topic 'ENERGY'>> > _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 'vigor' >>
<p>[<sss><<topic 'ENERGY'>> > _topic</sss>]</p>
<p>Stamina/Vigor (<span class='statval PHY'><<topic 'PHY'>></span> x <span class='statval STR'><<topic 'STR'>></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 'PHY'>> and/or <<topic 'STR'>>. 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 'focus' >>
<p>[<sss><<topic 'ENERGY'>> > _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 'skill' >>
<p>[<sss><<topic 'ENERGY'>> > _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 'Qi' >>
<p>[<sss><<topic 'ENERGY'>> > _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.ENGINE.gym_listWorkouts_forMuscle('Calves');>></p>
<<case 'Quads' 'Quadriceps' >>
<p>[<sss><<topic 'BODY'>> > <<topic 'MUSCLES'>> > _topic</sss>]</p>
<p>...<<topic ''>>...</p>
<p><<print setup.ENGINE.gym_listWorkouts_forMuscle('Quads');>></p>
<<case 'Hamstrings' 'Hams' >>
<p>[<sss><<topic 'BODY'>> > <<topic 'MUSCLES'>> > _topic</sss>]</p>
<p>...<<topic ''>>...</p>
<p><<print setup.ENGINE.gym_listWorkouts_forMuscle('Hams');>></p>
<<case 'Glutes' 'Gluteus' >>
<p>[<sss><<topic 'BODY'>> > <<topic 'MUSCLES'>> > _topic</sss>]</p>
<p>...<<topic ''>>...</p>
<p><<print setup.ENGINE.gym_listWorkouts_forMuscle('Glutes');>></p>
<<case 'Hips' 'Hipflexors' >>
<p>[<sss><<topic 'BODY'>> > <<topic 'MUSCLES'>> > _topic</sss>]</p>
<p>...<<topic ''>>...</p>
<p><<print setup.ENGINE.gym_listWorkouts_forMuscle('Hips');>></p>
<<case 'Lower Back' 'LoBack' >>
<p>[<sss><<topic 'BODY'>> > <<topic 'MUSCLES'>> > _topic</sss>]</p>
<p>...<<topic ''>>...</p>
<p><<print setup.ENGINE.gym_listWorkouts_forMuscle('LoBack');>></p>
<<case 'Lats' 'Latissimus' >>
<p>[<sss><<topic 'BODY'>> > <<topic 'MUSCLES'>> > _topic</sss>]</p>
<p>...<<topic ''>>...</p>
<p><<print setup.ENGINE.gym_listWorkouts_forMuscle('Lats');>></p>
<<case 'Traps' 'Trapezius' >>
<p>[<sss><<topic 'BODY'>> > <<topic 'MUSCLES'>> > _topic</sss>]</p>
<p>...<<topic ''>>...</p>
<p><<print setup.ENGINE.gym_listWorkouts_forMuscle('Traps');>></p>
<<case 'Abs' 'Abdominals' >>
<p>[<sss><<topic 'BODY'>> > <<topic 'MUSCLES'>> > _topic</sss>]</p>
<p>...<<topic ''>>...</p>
<p><<print setup.ENGINE.gym_listWorkouts_forMuscle('Abs');>></p>
<<case 'Pecs' 'Pectorals' >>
<p>[<sss><<topic 'BODY'>> > <<topic 'MUSCLES'>> > _topic</sss>]</p>
<p>...<<topic ''>>...</p>
<p><<print setup.ENGINE.gym_listWorkouts_forMuscle('Pecs');>></p>
<<case 'Delts' 'Deltoids' >>
<p>[<sss><<topic 'BODY'>> > <<topic 'MUSCLES'>> > _topic</sss>]</p>
<p>...<<topic ''>>...</p>
<p><<print setup.ENGINE.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.ENGINE.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.ENGINE.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.ENGINE.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.ENGINE.gym_listWorkouts_forMuscle('LeftGrip');>></p>
<<case 'Cardio' >>
<p>[<sss><<topic 'BODY'>> > <<topic 'MUSCLES'>> > _topic</sss>]</p>
<p>...<<topic ''>>...</p>
<p><<print setup.ENGINE.gym_listWorkouts_forMuscle('Cardio');>></p>
<<case 'Kegel' >>
<p>[<sss><<topic 'BODY'>> > <<topic 'MUSCLES'>> > _topic</sss>]</p>
<p>...<<topic ''>>...</p>
<p><<print setup.ENGINE.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 'WORK HEAVY/FAST'>> - gives a bonus to the <span class='statval SPD'><<topic 'SPD'>></span> stat.</p>
<p><<topic 'BURNOUT/MAX REPS'>> - gives a bonus to the <span class='statval END'><<topic 'END'>></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 'SLOW REPS/MAX FLEX'>> - gives a bonus to the <span class='statval PHY'><<topic 'PHY'>></span> stat.</p>
<p><<topic 'GO FOR MAX LIFT'>> - gives a bonus to the <span class='statval STR'><<topic 'STR'>></span> stat.</p>
<p><<topic 'PROPER TECHNIQUE'>> - gives a bonus to the <span class='statval INS'><<topic 'INS'>></span> stat.</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 '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 '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 '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 '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 '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.ENGINE.gym_listMuscles_forWorkout('Back Extension');>></p>
<<case 'Crunch' >>
<p>[<sss><<topic 'GYM'>> > <<topic 'PT AREA'>> > _topic</sss>]</p>
<p>...<<topic ''>>...</p>
<p><<print setup.ENGINE.gym_listMuscles_forWorkout('Crunch');>></p>
<<case 'Dips' >>
<p>[<sss><<topic 'GYM'>> > <<topic 'PT AREA'>> > _topic</sss>]</p>
<p>...<<topic ''>>...</p>
<p><<print setup.ENGINE.gym_listMuscles_forWorkout('Dips');>></p>
<<case 'Leg Raise' >>
<p>[<sss><<topic 'GYM'>> > <<topic 'PT AREA'>> > _topic</sss>]</p>
<p>...<<topic ''>>...</p>
<p><<print setup.ENGINE.gym_listMuscles_forWorkout('Leg Raise');>></p>
<<case 'Lunge' >>
<p>[<sss><<topic 'GYM'>> > <<topic 'PT AREA'>> > _topic</sss>]</p>
<p>...<<topic ''>>...</p>
<p><<print setup.ENGINE.gym_listMuscles_forWorkout('Lunge');>></p>
<<case 'Pull-up' >>
<p>[<sss><<topic 'GYM'>> > <<topic 'PT AREA'>> > _topic</sss>]</p>
<p>...<<topic ''>>...</p>
<p><<print setup.ENGINE.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.ENGINE.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.ENGINE.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.ENGINE.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.ENGINE.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.ENGINE.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.ENGINE.gym_listMuscles_forWorkout('Chest Fly');>></p>
<<case 'Deadlift' >>
<p>[<sss><<topic 'GYM'>> > <<topic 'LIFT STATIONS'>> > _topic</sss>]</p>
<p>...<<topic ''>>...</p>
<p><<print setup.ENGINE.gym_listMuscles_forWorkout('Deadlift');>></p>
<<case 'Lateral Raise' >>
<p>[<sss><<topic 'GYM'>> > <<topic 'LIFT STATIONS'>> > _topic</sss>]</p>
<p>...<<topic ''>>...</p>
<p><<print setup.ENGINE.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.ENGINE.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.ENGINE.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.ENGINE.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.ENGINE.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.ENGINE.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.ENGINE.gym_listMuscles_forWorkout('Shoulder Shrug');>></p>
<<case 'Squat' >>
<p>[<sss><<topic 'GYM'>> > <<topic 'LIFT STATIONS'>> > _topic</sss>]</p>
<p>...<<topic ''>>...</p>
<p><<print setup.ENGINE.gym_listMuscles_forWorkout('Squat');>></p>
<<case 'Triceps Extension'>>
<p>[<sss><<topic 'GYM'>> > <<topic 'LIFT STATIONS'>> > _topic</sss>]</p>
<p>...<<topic ''>>...</p>
<p><<print setup.ENGINE.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.ENGINE.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.ENGINE.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.ENGINE.abFlicker('clerk, ', 'cleric,'); >> is the <<print setup.ENGINE.abFlicker('cute', ' cat '); >> girl at the gym counter/front-desk with the box of <<print setup.ENGINE.abFlicker('necco', ' neko '); >> wafers.</p>
<<print setup.ENGINE.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.ENGINE.menuShow('guide');>><</link>></p>
<</if>>Double-click this passage to edit it.Double-click this passage to edit it.