Your browser lacks required capabilities. Please upgrade it or switch to another to continue.
<br/>
<br/>
<br/>
<h1 class='title'>H A R D L I F E (v. <<print setup.ENGINE.gameVersion>>)</h1>
<br/>
<br/>
<p class='sub-title'>select your character</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='[ESC]'>[[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 HYGENE]]</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.long_menus(); >>
</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.hide_menu();>><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>
<div class='energy-matrix half-glass'>
<<print setup.ENGINE.getResource('tough') >>
<<print setup.ENGINE.getResource('power') >>
<<print setup.ENGINE.getResource('vigor') >>
<<print setup.ENGINE.getResource('skill') >>
<<print setup.ENGINE.getResource('train') >>
<<print setup.ENGINE.getResource('regen') >>
<<print setup.ENGINE.getResource('vital') >>
<<print setup.ENGINE.getResource('force') >>
<<print setup.ENGINE.getResource('guard') >>
<<print setup.ENGINE.getResource('metab') >>
<<print setup.ENGINE.getResource('fight') >>
<<print setup.ENGINE.getResource('react') >>
<<print setup.ENGINE.getResource('focus') >>
<<print setup.ENGINE.getResource('aware') >>
<<print setup.ENGINE.getResource('psych') >>
</div>
</div>
</div><div class='left framed'>
<h4>STATS / METRICS</h4>
<table class='stats'>
<tr> <th><<print setup.ENGINE.karmic_link('STR')>>:</th> <th><<print ($GAMEDATA.PC.STATS.STR).toFixed(3)>></th> </tr>
<tr> <th><<print setup.ENGINE.karmic_link('END')>>:</th> <th><<print ($GAMEDATA.PC.STATS.END).toFixed(3)>></th> </tr>
<tr> <th><<print setup.ENGINE.karmic_link('SPD')>>:</th> <th><<print ($GAMEDATA.PC.STATS.SPD).toFixed(3)>></th> </tr>
<tr> <th><<print setup.ENGINE.karmic_link('PHY')>>:</th> <th><<print ($GAMEDATA.PC.STATS.PHY).toFixed(3)>></th> </tr>
<tr> <th><<print setup.ENGINE.karmic_link('INS')>>:</th> <th><<print ($GAMEDATA.PC.STATS.INS).toFixed(3)>></th> </tr>
<tr> <th><<print setup.ENGINE.karmic_link('WSD')>>:</th> <th><<print ($GAMEDATA.PC.STATS.WSD).toFixed(3)>></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='[ESC]'>[[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='[ESC]'>[[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='[ESC]'>[[RETURN->GO HOME]]</p>
<</if>><p class='keypress' key='[ESC]'>[[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.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.show_menu('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.long_menus(); >>
</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.long_menus(); >>
</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.hide_menu();>><</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.show_menu('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.show_menu('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.hide_menu();
>>
<</link>></p>
<br /><br /><br /><br /><br />
<<set _open = 0; _pack = 0;>>
<<for _item_id, _uses range $GAMEDATA.PC.STUFF>>
<<if "consumable"==setup.ROLES.ALL[setup.ITEMS[_item_id].role].type >>
<<print setup.ENGINE.wrap(
setup.ENGINE.foodCard(_item_id),
'div', 'item 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.hide_menu();
>>
<</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='[F3]'><<link "Stats & Metrics">><<replace "#detail">><<set $GAMEDATA.PC.STATE.detail="STATS"; >><<include "STATS" >><</replace>><</link>></li>
<li class='keypress' key='[F4]'><<link "Resources" >><<replace "#detail">><<set $GAMEDATA.PC.STATE.detail="RESOURCES"; >><<include "RESOURCES" >><</replace>><</link>></li>
<li class='keypress' key='[F5]'><<link "Energy Levels" >><<replace "#detail">><<set $GAMEDATA.PC.STATE.detail="ENERGY"; >><<include "ENERGY" >><</replace>><</link>></li>
<hr/>
<<print setup.ENGINE.short_menus(); >>
</ul>
<hr/><hr/><a target="_blank" href='http://patreon.com/ShadowRx'>ShadowRx</a><h3>HardLife</h3>
<small>
v<<print setup.ENGINE.gameVersion>> by<br/>
<a target="_blank" href='http://patreon.com/ShadowRx'>ShadowRx</a><br/>
<small>(<<print setup.ENGINE.buildVersion>>)</small><br/>
</small>
<br/>
<hr/>
<ul class='side-menu'>
<li class='keypress' key='[F2]'><<link "Save/Load">><<script>>UI.saves()<</script>><</link>></li>
<li class='keypress' key=''><<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 the hottest producer 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(23,1)>>
<p>Its gonna be a long day tomorrow, perhaps you should [[turn in->SLEEP IN CAR]].</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.hide_menu();
>>
<</link>>
</span> / <span class='keypress' key='[ESC]'><<link 'NO'>><<run setup.ENGINE.hide_menu();>><</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.hide_menu();>><</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': "hygene", 'MATRIX':{} },
/* END setup.ITEMS */ }>><<set setup.ENGINE={ /* GAME ENGINE -- everything below this point */
'gameVersion' : 0.2497,
'buildVersion' : "public build",
'versionUpdate' : function() {
/* v0.1-0.11 */
var out_of_date=false;
var PC = $GAMEDATA.PC;
/* 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.gameVersion ){
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 ={}; }
/* 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(!$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; PC.WORLD={}; }
if(!PC.WORLD.girlPower) { out_of_date=true; PC.WORLD.girlPower=1; }
if(!PC.WORLD.amazonIndex) { out_of_date=true; PC.WORLD.amazonIndex=PC.WORLD.girlPower/10; }
}
/* 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.gameVersion; }
}
},
'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) {
rate=(rate||setup.ENGINE.sqrt($GAMEDATA.PC.MATRIX.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 unbalanced = true;
var loops = 0;
/* ADJUST WEIGHT - rebalance, lose, then gain */
while((CHAR.METRICS.adj_wt>(CHAR.METRICS.ht/2))&&( unbalanced )&&( loops<(bodymass*hours/10) )&&( loops<10000 )) {
unbalanced = false; loops++;
/* convert sugar to/from protein */
if(( (Math.abs(CHAR.MATRIX.protein)+Math.abs(CHAR.MATRIX.sugar))>CHAR.METRICS.wt*5 )&&( (CHAR.MATRIX.protein*2)<CHAR.MATRIX.sugar )) {
CHAR.MATRIX.sugar -= (bodymass * 0.9);
CHAR.MATRIX.protein += (bodymass * 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(CHAR.MATRIX.protein)+Math.abs(CHAR.MATRIX.sugar))>CHAR.METRICS.wt*5 )&&( CHAR.MATRIX.protein>(CHAR.MATRIX.sugar*2) )) {
CHAR.MATRIX.protein -= (bodymass * 0.8);
CHAR.MATRIX.sugar += (bodymass * 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(CHAR.MATRIX.kcal)+Math.abs(CHAR.MATRIX.sugar))>CHAR.METRICS.wt*30 )&&( (CHAR.MATRIX.kcal<-100)&&(CHAR.MATRIX.sugar>0) )) {
CHAR.MATRIX.kcal += (bodymass * 12.0);
CHAR.MATRIX.sugar -= (bodymass * 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(CHAR.MATRIX.kcal)+Math.abs(CHAR.MATRIX.sugar))>CHAR.METRICS.wt*30 )&&( (CHAR.MATRIX.kcal>5000)&&(CHAR.MATRIX.sugar<200) )) {
CHAR.MATRIX.kcal -= (bodymass * 12.0);
CHAR.MATRIX.sugar += (bodymass * 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(CHAR.MATRIX.kcal)+Math.abs(CHAR.MATRIX.protein))>CHAR.METRICS.wt*10 )&&( (CHAR.MATRIX.kcal<-100) && (CHAR.MATRIX.protein>0) )) {
CHAR.MATRIX.kcal += (bodymass * 4.5);
CHAR.MATRIX.protein -= (bodymass * 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(CHAR.MATRIX.kcal)+Math.abs(CHAR.MATRIX.protein))>CHAR.METRICS.wt*10 )&&( (CHAR.MATRIX.kcal>5000)&&(CHAR.MATRIX.protein<100) )) {
CHAR.MATRIX.kcal -= (bodymass * 4.5);
CHAR.MATRIX.protein += (bodymass * 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( (CHAR.MATRIX.kcal<-4000) || (CHAR.MATRIX.sugar<-500) || (CHAR.MATRIX.protein<-350) || ((CHAR.MATRIX.sugar<-200)&&(CHAR.MATRIX.kcal<-750)) || ((CHAR.MATRIX.sugar<100)&&(CHAR.MATRIX.kcal<-3000)) ) {
/* setup.ENGINE.debugLog(loops + ': lost a pound -- wt: '+ CHAR.METRICS.wt +'; kCal: '+ CHAR.MATRIX.kcal +'; protein: '+ CHAR.MATRIX.protein +'g; sugar: '+ CHAR.MATRIX.sugar +'g;'); */
CHAR.METRICS.wt -= 1;
CHAR.MATRIX.sugar += 650;
CHAR.MATRIX.kcal += 3250;
CHAR.MATRIX.protein += 345;
unbalanced = true;
} else if( (CHAR.MATRIX.kcal>9500) || (CHAR.MATRIX.sugar>2000) || (CHAR.MATRIX.protein>1500) || ((CHAR.MATRIX.sugar>600)&&(CHAR.MATRIX.kcal>2500)) || ((CHAR.MATRIX.sugar>300)&&(CHAR.MATRIX.kcal>6000)) ) {
/* setup.ENGINE.debugLog(loops + ': gained a pound -- wt: '+ CHAR.METRICS.wt +'; kCal: '+ CHAR.MATRIX.kcal +'; protein: '+ CHAR.MATRIX.protein +'g; sugar: '+ CHAR.MATRIX.sugar +'g;'); */
CHAR.METRICS.wt += 1;
CHAR.MATRIX.sugar -= 750;
CHAR.MATRIX.kcal -= 3750;
CHAR.MATRIX.protein -= 410;
unbalanced = true;
}
/* repeat until no rebalances trigger */
}
},
'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.PC.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 */
var creatine_reserve = setup.ENGINE.sqrt( (E.vigor*S.caliber)-(E.metab/S.caliber),'-' ); /* + (M.adj_wt*0.001*S.caliber); */
var scaled_mass = ((M.adj_wt/(S.PHY/10))-creatine_reserve);
/* efficiency caps at (wt/10+lv)/cal # min bodymass */
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); }
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;
},
'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;
},
'check_sale' : function(item_id) {
return 0.0;
},
'darkAdd' : function(amt, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
CHAR.MATRIX.dark += amt;
CHAR.MATRIX.light += amt * -0.5;
},
'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);
if(isNaN(CHAR.MATRIX.kcal)) { CHAR.MATRIX.kcal=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);
/* PASSIVE REGEN and bleedoff, moderate activity */
setup.ENGINE.energyBleedOff(hours, null, CHAR);
setup.ENGINE.recoverPassive(hours, CHAR);
CHAR.MATRIX.kcal -= (bodymass*hours*0.45);
/* 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.addHours(hours);
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'];
/* alert(JSON.stringify(MATRIX)); */
Object.keys(MATRIX).forEach(function(part) {
if(CHAR.BODY[part]) {
if(isNaN(CHAR.BODY[part].damage)) { CHAR.BODY[part].damage = 0; }
if(isNaN(CHAR.BODY[part].train)) { CHAR.BODY[part].train = CHAR.STATS.caliber/2; }
CHAR.BODY[part].damage+=(MATRIX[part]*units/total);
}
});
setup.ENGINE.doTrainingMATRIX( MATRIX, total, (0.1/CHAR.STATS.caliber), 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');
/* alert(JSON.stringify(MATRIX)); */
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 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) {
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.01*CHAR.STATS.caliber);
} else {
switch(true) {
case (reps<0.50):
setup.ENGINE.doDamageMATRIX( setup.WORKOUTS[workout].MATRIX, setup.WORKOUTS[workout].total, 1.0, CHAR);
CHAR.STATS[bonus] += 0.03;
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, 1.0, CHAR);
CHAR.STATS[bonus] += 0.03;
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, 1.0, CHAR);
CHAR.STATS[bonus] += 0.03;
out = "You almost had it, but couldn't quite finish the rep.";
break;
}
}
setup.ENGINE.doWorkout(setup.WORKOUTS[workout].action, 0.1, (CHAR.STATS.caliber/3), CHAR);
} else {
out = "You're too tired to workout right now.";
}
if(settings.debugInfo) {
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);
/* adjust weight */
setup.ENGINE.adjustWeight(hours, CHAR);
/* 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;
/* PASSIVE REGEN 1/2 and fast-bleedoff, high activity */
setup.ENGINE.energyBleedOff(hours*1.5, null, CHAR);
setup.ENGINE.recoverPassive(hours/2, CHAR);
CHAR.MATRIX.kcal -= (bodymass*hours*0.65);
/* 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.addHours(hours);
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;
},
'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 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 */
CHAR.MATRIX.tough = Math.min( CHAR.MATRIX.tough, (CHAR.STATS.STR * CHAR.STATS.END)*3 );
CHAR.MATRIX.power = Math.min( CHAR.MATRIX.power, (CHAR.STATS.STR * CHAR.STATS.SPD)*3 );
CHAR.MATRIX.vigor = Math.min( CHAR.MATRIX.vigor, (CHAR.STATS.STR * CHAR.STATS.PHY)*3 );
CHAR.MATRIX.skill = Math.min( CHAR.MATRIX.skill, (CHAR.STATS.STR * CHAR.STATS.INS)*3 );
CHAR.MATRIX.train = Math.min( CHAR.MATRIX.train, (CHAR.STATS.STR * CHAR.STATS.WSD)*3 );
CHAR.MATRIX.regen = Math.min( CHAR.MATRIX.regen, (CHAR.STATS.END * CHAR.STATS.SPD)*3 );
CHAR.MATRIX.vital = Math.min( CHAR.MATRIX.vital, (CHAR.STATS.END * CHAR.STATS.PHY)*3 );
CHAR.MATRIX.force = Math.min( CHAR.MATRIX.force, (CHAR.STATS.END * CHAR.STATS.INS)*3 );
CHAR.MATRIX.guard = Math.min( CHAR.MATRIX.guard, (CHAR.STATS.END * CHAR.STATS.WSD)*3 );
CHAR.MATRIX.metab = Math.min( CHAR.MATRIX.metab, (CHAR.STATS.SPD * CHAR.STATS.PHY)*3 );
CHAR.MATRIX.fight = Math.min( CHAR.MATRIX.fight, (CHAR.STATS.SPD * CHAR.STATS.INS)*3 );
CHAR.MATRIX.react = Math.min( CHAR.MATRIX.react, (CHAR.STATS.SPD * CHAR.STATS.WSD)*3 );
CHAR.MATRIX.focus = Math.min( CHAR.MATRIX.focus, (CHAR.STATS.PHY * CHAR.STATS.INS)*3 );
CHAR.MATRIX.aware = Math.min( CHAR.MATRIX.aware, (CHAR.STATS.PHY * CHAR.STATS.WSD)*3 );
CHAR.MATRIX.psych = Math.min( CHAR.MATRIX.psych, (CHAR.STATS.INS * CHAR.STATS.WSD)*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(CHAR.MATRIX.tough>(CHAR.STATS.STR * CHAR.STATS.END)) { CHAR.MATRIX.tough *= falloff; }
if(CHAR.MATRIX.power>(CHAR.STATS.STR * CHAR.STATS.SPD)) { CHAR.MATRIX.power *= falloff; }
if(CHAR.MATRIX.vigor>(CHAR.STATS.STR * CHAR.STATS.PHY)) { CHAR.MATRIX.vigor *= falloff; }
if(CHAR.MATRIX.skill>(CHAR.STATS.STR * CHAR.STATS.INS)) { CHAR.MATRIX.skill *= falloff; }
if(CHAR.MATRIX.train>(CHAR.STATS.STR * CHAR.STATS.WSD)) { CHAR.MATRIX.train *= falloff; }
if(CHAR.MATRIX.regen>(CHAR.STATS.END * CHAR.STATS.SPD)) { CHAR.MATRIX.regen *= falloff; }
if(CHAR.MATRIX.vital>(CHAR.STATS.END * CHAR.STATS.PHY)) { CHAR.MATRIX.vital *= falloff; }
if(CHAR.MATRIX.force>(CHAR.STATS.END * CHAR.STATS.INS)) { CHAR.MATRIX.force *= falloff; }
if(CHAR.MATRIX.guard>(CHAR.STATS.END * CHAR.STATS.WSD)) { CHAR.MATRIX.guard *= falloff; }
if(CHAR.MATRIX.metab>(CHAR.STATS.SPD * CHAR.STATS.PHY)) { CHAR.MATRIX.metab *= falloff; }
if(CHAR.MATRIX.fight>(CHAR.STATS.SPD * CHAR.STATS.INS)) { CHAR.MATRIX.fight *= falloff; }
if(CHAR.MATRIX.react>(CHAR.STATS.SPD * CHAR.STATS.WSD)) { CHAR.MATRIX.react *= falloff; }
if(CHAR.MATRIX.focus>(CHAR.STATS.PHY * CHAR.STATS.INS)) { CHAR.MATRIX.focus *= falloff; }
if(CHAR.MATRIX.aware>(CHAR.STATS.PHY * CHAR.STATS.WSD)) { CHAR.MATRIX.aware *= falloff; }
if(CHAR.MATRIX.psych>(CHAR.STATS.INS * CHAR.STATS.WSD)) { CHAR.MATRIX.psych *= falloff; }
/* bleed off excessive karma at 1% per cycle */
if(CHAR.MATRIX.light>CHAR.STATS.karmic_well) { CHAR.MATRIX.light *= kfalloff; }
if(CHAR.MATRIX.dark >CHAR.STATS.karmic_well) { CHAR.MATRIX.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.sqrt(setup.ENGINE.getTotalKarma(CHAR), '0')/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];
/* setup.ENGINE.WTF(item_id, true); */
_open = _uses % setup.ITEMS[item_id].uses;
_pack = setup.ITEMS[item_id].uses;
_uses = $GAMEDATA.PC.STUFF[item_id] || 0;
if(_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'>"+ ITEM.uses +' servings per container'+"</span></div>
<div><img class='icon glass' /></div>
<div><span class='uses'><span class='on_hand'>"+ _uses +"</span> servings on hand</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>
<span>tough:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.tough) +"</span>
<span>power:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.power) +"</span>
<span>vigor:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.vigor) +"</span>
<span>skill:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.skill) +"</span>
<span>train:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.train) +"</span>
<span>regen:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.regen) +"</span>
<span>vital:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.vital) +"</span>
<span>force:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.force) +"</span>
<span>guard:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.guard) +"</span>
<span>metab:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.metab) +"</span>
<span>fight:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.fight) +"</span>
<span>react:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.react) +"</span>
<span>focus:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.focus) +"</span>
<span>aware:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.aware) +"</span>
<span>psych:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.psych) +"</span>
</div>
</div>
</div>
<div class='bottom_bar glass'>
<span class='link'>
<<link '[have one]'>>
<<run setup.ENGINE.useItem( '"+ _item_id +"' ); >>
<<replace '#"+ _item_id +"'>><<print setup.ENGINE.foodCard('"+ _item_id +"');>><</replace>>
<</link>>
</span>
<<if _uses>9>>
<span class='link'>
<<link '[have ten]'>>
<<run setup.ENGINE.useItem( '"+ _item_id +"', "+ 10 +" ); >>
<<replace '#"+ _item_id +"'>><<print setup.ENGINE.foodCard('"+ _item_id +"');>><</replace>>
<</link>>
</span>
<</if>>
<<if _open>0>>
<span class='link'>
<<link '[finish package]'>>
<<run setup.ENGINE.useItem( '"+ item_id +"', "+ _open +" ); >>
<<replace '#"+ _item_id +"'>><<print setup.ENGINE.foodCard('"+ _item_id +"');>><</replace>>
<</link>>
</span>
<<elseif _uses>=_pack>>
<span class='link'>
<<link '[whole pack]'>>
<<run setup.ENGINE.useItem( '"+ item_id +"', "+ _pack +" ); >>
<<replace '#"+ _item_id +"'>><<print setup.ENGINE.foodCard('"+ _item_id +"');>><</replace>>
<</link>>
</span>
<</if>>
<<if _uses>99>>
<span class='link'>
<<link '[have 100]'>>
<<run setup.ENGINE.useItem( '"+ item_id +"', "+ 100 +" ); >>
<<replace '#"+ _item_id +"'>><<print setup.ENGINE.foodCard('"+ _item_id +"');>><</replace>>
<</link>>
</span>
<</if>>
</div>
";
},
'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;
},
'generateRandomEncounterMatrix' : function(STATS, min, max) {
min=min||0.5;
max=max||2.0;
var MATRIX = {
'tough' : (STATS.STR * STATS.END),
'power' : (STATS.STR * STATS.SPD),
'vigor' : (STATS.STR * STATS.PHY),
'skill' : (STATS.STR * STATS.INS),
'train' : (STATS.STR * STATS.WSD),
'regen' : (STATS.END * STATS.SPD),
'vital' : (STATS.END * STATS.PHY),
'force' : (STATS.END * STATS.INS),
'guard' : (STATS.END * STATS.WSD),
'metab' : (STATS.SPD * STATS.PHY),
'fight' : (STATS.SPD * STATS.INS),
'react' : (STATS.SPD * STATS.WSD),
'focus' : (STATS.PHY * STATS.INS),
'aware' : (STATS.PHY * STATS.WSD),
'psych' : (STATS.INS * STATS.WSD),
};
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(LICENSE) {
var f = LICENSE.gender=='female';
var m = LICENSE.gender=='male';
var scale = setup.ENGINE.pow((((LICENSE.ht+(LICENSE.wt/5)-(LICENSE.age/3))*(f?1.16:0.84))/72), (1.69+(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' : 5+( setup.ENGINE.randomStat(9, 5) * either(scaleup, halfdown, halfup ) ),
'END' : 5+( setup.ENGINE.randomStat(9, 5) * either(scaleup, halfdown, halfup ) ),
'SPD' : 5+( setup.ENGINE.randomStat(9, 5) * either(halfup, halfdown, halfdown) ),
'PHY' : 5+( setup.ENGINE.randomStat(9, 5) * either(halfup, halfup, halfdown) ),
'INS' : 5+( setup.ENGINE.randomStat(9, 5) * either(scaledown, halfup, halfdown) ),
'WSD' : 5+( setup.ENGINE.randomStat(9, 5) * either(scaledown, halfup, halfdown) ),
};
STATS = setup.ENGINE.azIScaleStats(LICENSE.gender, STATS, {'BASE':{ 'STR':5, 'END':3, 'SPD':3, 'PHY':3, 'INS':1, 'WSD':1 }});
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;
},
'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 'tough':
case 'power':
case 'vigor':
case 'skill':
case 'train':
case 'regen':
case 'vital':
case 'force':
case 'guard':
case 'metab':
case 'fight':
case 'react':
case 'focus':
case 'aware':
case 'psych': 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;
}
}
/* var pct=CHAR.MATRIX[res]/max*30; */
var pct= Math.log(CHAR.MATRIX[res]/max*30)*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);
}
},
'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;
},
'hide_menu' : function() {
$('#menu').html('');
$('#menu').hide();
},
'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;
},
'icon_menus' : function(LIST, wrap, cls, ATTR) { LIST=LIST||setup.MENU; wrap=wrap||'img'; cls=cls||'keypress'; ATTR=ATTR||{}; return setup.ENGINE.list_menus(LIST, 'icon' , wrap, cls, ATTR ); },
'in2cm' : function(inches) { return inches*2.54; },
'in2ft' : function(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,
};
});
return BODY
},
'itemCard' : function(item_id) {
var ITEM = setup.ITEMS[item_id];
return "
<div class='item "+ _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'>"+ ITEM.uses +(_dept=='D05' ? ' servings' : ' 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>
<span>tough:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.tough) +"</span>
<span>power:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.power) +"</span>
<span>vigor:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.vigor) +"</span>
<span>skill:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.skill) +"</span>
<span>train:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.train) +"</span>
<span>regen:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.regen) +"</span>
<span>vital:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.vital) +"</span>
<span>force:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.force) +"</span>
<span>guard:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.guard) +"</span>
<span>metab:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.metab) +"</span>
<span>fight:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.fight) +"</span>
<span>react:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.react) +"</span>
<span>focus:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.focus) +"</span>
<span>aware:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.aware) +"</span>
<span>psych:<br/>"+ setup.ENGINE.formatMatrixValue(ITEM.MATRIX.psych) +"</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 lightBal = setup.ENGINE.getBalanceLight(CHAR);
var darkBal = setup.ENGINE.getBalanceDark(CHAR);
CHAR.MATRIX.light += amt * lightBal;
CHAR.MATRIX.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;
},
'lbs2kg' : function(pounds) { return pounds/2.2; },
'lightAdd' : function(amt, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
CHAR.MATRIX.light += amt;
CHAR.MATRIX.dark += amt * -0.5;
},
'listLoads_forWorkout' : function(workout, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
workout=workout||_workout;
var hbw = (CHAR.METRICS.adj_wt * setup.WORKOUTS[workout].pbw)/2;
var out = '';
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 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 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 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 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 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, },
'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, },
};
/* not ready until we switch from reps to minutes */
LOADS={};
break;
case 'reps':
/* units=0 == auto */
LOADS={
'WORK STR' :{ 'lnk':( (settings.debugInfo ? '[STR+] ' : '')+ '<bb>GOR 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 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 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 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 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, },
'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, },
};
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>";
},
'list_menus' : 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; }
out += setup.ENGINE.wrap("<<link '"+ LIST[li][lnk] +"'>><<run setup.ENGINE.show_menu('"+ li +"'); >><</link>>", wrap, cls, ATTR);
}
});
return out;
},
'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> =condition </td> <td> /potential </td></tr>";
var cal = CHAR.STATS.caliber;
Object.keys(CHAR.BODY).forEach(function(part) {
if(setup.BODY[part].type=='muscle') {
table += "<tr><td style='width: 99%;'>"+ setup.ENGINE.powerMeter(CHAR.BODY[part].train, cal) +"</td><td>"+setup.BODY[part].name+"</td> <td>"+(CHAR.BODY[part].train*cal).toFixed(1)+"</td> <td>"+CHAR.BODY[part].damage.toFixed(1)+"</td> <td>"+((CHAR.BODY[part].train*cal)-CHAR.BODY[part].damage).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 {
'STR':'Strength',
'END':'Endurance',
'SPD':'Speed',
'PHY':'Physique',
'INS':'Instinct',
'WSD':'Wisdom',
};
},
'listWorkouts_forArea' : function(gym_area) {
var out="<ul class='workouts'>";
Object.keys(setup.WORKOUTS).forEach(function(workout) {
if(gym_area==setup.WORKOUTS[workout].area) {
out += " <li><<link '"+ workout +"'>><<set _workout='"+ workout +"'>><<print setup.ENGINE.reloadPassage(); >><</link>></li>";
}
});
out+="</ul>";
return out;
},
'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;
}
},
'long_menus' : function(LIST, wrap, cls, ATTR) { LIST=LIST||setup.MENU; wrap=wrap||'p'; cls=cls||'narrow keypress'; ATTR=ATTR||{}; return setup.ENGINE.list_menus(LIST, 'long' , wrap, cls, ATTR ); },
'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 maxRes = null;
switch(res) {
case 'tough': maxRes = (CHAR.STATS.STR * CHAR.STATS.END); break;
case 'power': maxRes = (CHAR.STATS.STR * CHAR.STATS.SPD); break;
case 'vigor': maxRes = (CHAR.STATS.STR * CHAR.STATS.PHY); break;
case 'skill': maxRes = (CHAR.STATS.STR * CHAR.STATS.INS); break;
case 'train': maxRes = (CHAR.STATS.STR * CHAR.STATS.WSD); break;
case 'regen': maxRes = (CHAR.STATS.END * CHAR.STATS.SPD); break;
case 'vital': maxRes = (CHAR.STATS.END * CHAR.STATS.PHY); break;
case 'force': maxRes = (CHAR.STATS.END * CHAR.STATS.INS); break;
case 'guard': maxRes = (CHAR.STATS.END * CHAR.STATS.WSD); break;
case 'metab': maxRes = (CHAR.STATS.SPD * CHAR.STATS.PHY); break;
case 'fight': maxRes = (CHAR.STATS.SPD * CHAR.STATS.INS); break;
case 'react': maxRes = (CHAR.STATS.SPD * CHAR.STATS.WSD); break;
case 'focus': maxRes = (CHAR.STATS.PHY * CHAR.STATS.INS); break;
case 'aware': maxRes = (CHAR.STATS.PHY * CHAR.STATS.WSD); break;
case 'psych': maxRes = (CHAR.STATS.INS * CHAR.STATS.WSD); break;
default: break;
}
return maxRes;
},
'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.addHours(hours);
/* 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();
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);
/* 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>0.1) {
TO_CHAR.BODY[part].train += Math.min(FROM_CHAR.BODY[part].train, (FROM_CHAR.BODY[part].train) * (amt*3) * (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.09) {
FROM_CHAR.BODY[part].train=0.1;
}
}
});
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, 1.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) {
var valid=value;
switch(context) {
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 = {
'tough':0, 'power':0, 'vigor':0, 'skill':0, 'train':0,
'regen':0, 'vital':0, 'force':0, 'guard':0, 'metab':0,
'fight':0, 'react':0, 'focus':0, 'aware':0, 'psych':0,
};
var add = amt/Object.keys(E).length;
/* 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)
);
});
},
'qiCalc' : function(CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
CHAR.MATRIX.qi = (
CHAR.MATRIX.tough
+ CHAR.MATRIX.power
+ CHAR.MATRIX.vigor
+ CHAR.MATRIX.skill
+ CHAR.MATRIX.train
+ CHAR.MATRIX.regen
+ CHAR.MATRIX.vital
+ CHAR.MATRIX.force
+ CHAR.MATRIX.guard
+ CHAR.MATRIX.metab
+ CHAR.MATRIX.fight
+ CHAR.MATRIX.react
+ CHAR.MATRIX.focus
+ CHAR.MATRIX.aware
+ CHAR.MATRIX.psych
);
CHAR.STATS.max_qi = (
setup.ENGINE.maxResource('tough', CHAR)
+ setup.ENGINE.maxResource('power', CHAR)
+ setup.ENGINE.maxResource('vigor', CHAR)
+ setup.ENGINE.maxResource('skill', CHAR)
+ setup.ENGINE.maxResource('train', CHAR)
+ setup.ENGINE.maxResource('regen', CHAR)
+ setup.ENGINE.maxResource('vital', CHAR)
+ setup.ENGINE.maxResource('force', CHAR)
+ setup.ENGINE.maxResource('guard', CHAR)
+ setup.ENGINE.maxResource('metab', CHAR)
+ setup.ENGINE.maxResource('fight', CHAR)
+ setup.ENGINE.maxResource('react', CHAR)
+ setup.ENGINE.maxResource('focus', CHAR)
+ setup.ENGINE.maxResource('aware', CHAR)
+ setup.ENGINE.maxResource('psych', CHAR)
);
},
'qiFlow' : function(rate, cycles, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
rate=rate||0.1;
cycles=cycles||3;
cycles=setup.ENGINE.putInBounds(cycles, 'qiFlow-cycles');
var M = {};
var S = CHAR.STATS;
for(var i=0; i<cycles; i++) {
M = Object.assign({}, CHAR.MATRIX);
/* QI FLOW OUTBOUND INBOUND GENERATED */
CHAR.MATRIX.tough += -(M.tough*rate) +( (M.vigor + M.train + M.vital + M.guard) /4 *rate ) +((S.STR+S.END)*S.caliber*rate);
CHAR.MATRIX.power += -(M.power*rate) +( (M.metab + M.react + M.skill + M.tough) /4 *rate ) +((S.STR+S.SPD)*S.caliber*rate);
CHAR.MATRIX.vigor += -(M.vigor*rate) +( (M.metab + M.aware + M.train + M.power) /4 *rate ) +((S.STR+S.PHY)*S.caliber*rate);
CHAR.MATRIX.skill += -(M.skill*rate) +( (M.tough + M.vigor + M.fight + M.psych) /4 *rate ) +((S.STR+S.INS)*S.caliber*rate);
CHAR.MATRIX.train += -(M.train*rate) +( (M.power + M.skill + M.react + M.psych) /4 *rate ) +((S.STR+S.WSD)*S.caliber*rate);
CHAR.MATRIX.regen += -(M.regen*rate) +( (M.fight + M.power + M.force + M.tough) /4 *rate ) +((S.END+S.SPD)*S.caliber*rate);
CHAR.MATRIX.vital += -(M.vital*rate) +( (M.focus + M.vigor + M.guard + M.regen) /4 *rate ) +((S.END+S.PHY)*S.caliber*rate);
CHAR.MATRIX.force += -(M.force*rate) +( (M.tough + M.vital + M.focus + M.skill) /4 *rate ) +((S.END+S.INS)*S.caliber*rate);
CHAR.MATRIX.guard += -(M.guard*rate) +( (M.regen + M.force + M.aware + M.train) /4 *rate ) +((S.END+S.WSD)*S.caliber*rate);
CHAR.MATRIX.metab += -(M.metab*rate) +( (M.react + M.regen + M.aware + M.vital) /4 *rate ) +((S.SPD+S.PHY)*S.caliber*rate);
CHAR.MATRIX.fight += -(M.fight*rate) +( (M.psych + M.force + M.power + M.metab) /4 *rate ) +((S.SPD+S.INS)*S.caliber*rate);
CHAR.MATRIX.react += -(M.react*rate) +( (M.psych + M.guard + M.regen + M.fight) /4 *rate ) +((S.SPD+S.WSD)*S.caliber*rate);
CHAR.MATRIX.focus += -(M.focus*rate) +( (M.vigor + M.metab + M.skill + M.fight) /4 *rate ) +((S.PHY+S.INS)*S.caliber*rate);
CHAR.MATRIX.aware += -(M.aware*rate) +( (M.train + M.react + M.vital + M.focus) /4 *rate ) +((S.PHY+S.WSD)*S.caliber*rate);
CHAR.MATRIX.psych += -(M.psych*rate) +( (M.guard + M.aware + M.force + M.focus) /4 *rate ) +((S.INS+S.WSD)*S.caliber*rate);
/* setup.ENGINE.debugLog(JSON.stringify(CHAR.MATRIX)); */
setup.ENGINE.energyBleedOff(1, null, CHAR);
M=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.PC.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');
/* ACTIVE REGEN */
CHAR.MATRIX.tough += (CHAR.STATS.STR + CHAR.STATS.END)/2 * hours *1.0;
CHAR.MATRIX.power += (CHAR.STATS.STR + CHAR.STATS.SPD)/2 * hours *1.0;
CHAR.MATRIX.vigor += (CHAR.STATS.STR + CHAR.STATS.PHY)/2 * hours *3.0;
CHAR.MATRIX.skill += (CHAR.STATS.STR + CHAR.STATS.INS)/2 * hours *3.0;
CHAR.MATRIX.train += (CHAR.STATS.STR + CHAR.STATS.WSD)/2 * hours *3.0;
CHAR.MATRIX.regen += (CHAR.STATS.END + CHAR.STATS.SPD)/2 * hours *7.0;
CHAR.MATRIX.vital += (CHAR.STATS.END + CHAR.STATS.PHY)/2 * hours *3.0;
CHAR.MATRIX.force += (CHAR.STATS.END + CHAR.STATS.INS)/2 * hours *3.0;
CHAR.MATRIX.guard += (CHAR.STATS.END + CHAR.STATS.WSD)/2 * hours *3.0;
CHAR.MATRIX.metab -= (CHAR.STATS.SPD + CHAR.STATS.PHY)/2 * hours *0.3;
CHAR.MATRIX.fight += (CHAR.STATS.SPD + CHAR.STATS.INS)/2 * hours *5.0;
CHAR.MATRIX.react += (CHAR.STATS.SPD + CHAR.STATS.WSD)/2 * hours *5.0;
CHAR.MATRIX.focus += (CHAR.STATS.PHY + CHAR.STATS.INS)/2 * hours *5.0;
CHAR.MATRIX.aware += (CHAR.STATS.PHY + CHAR.STATS.WSD)/2 * hours *5.0;
CHAR.MATRIX.psych += (CHAR.STATS.INS + CHAR.STATS.WSD)/2 * hours *5.0;
/* METABOLC BONUS FROM FOOD */
CHAR.MATRIX.vital += setup.ENGINE.sqrt(CHAR.MATRIX.regen, '-')*hours; CHAR.MATRIX.tough += setup.ENGINE.sqrt(CHAR.MATRIX.regen/2, '-')*hours;
CHAR.MATRIX.vigor += setup.ENGINE.sqrt(CHAR.MATRIX.metab, '-')*hours; CHAR.MATRIX.power += setup.ENGINE.sqrt(CHAR.MATRIX.metab/2, '-')*hours;
var base=0;
var amt=0;
var units = hours/48;
var regen = setup.ENGINE.pow(CHAR.MATRIX.regen, 1/3, '-');
var protein = 0;
Object.keys(CHAR.BODY).forEach(function(part) {
base=CHAR.BODY[part].damage + (CHAR.BODY[part].train * CHAR.STATS.caliber)+regen;
protein=Math.min(CHAR.MATRIX.protein, base);
CHAR.MATRIX.protein-=(protein/10);
amt = Math.min( CHAR.BODY[part].damage, units*(1 + setup.ENGINE.sqrt(3*(base+protein), '-')/100) );
CHAR.BODY[part].damage -= Math.max(amt, 0);
/* training is multiplied by caliber, damage is not, so we must scale them to meet */
CHAR.BODY[part].train = Math.min( (CHAR.BODY[part].train + (amt/CHAR.STATS.caliber)), (CHAR.STATS.caliber) );
});
setup.ENGINE.qiFlow(0.3, hours, CHAR);
},
'recoverPassive' : function(hours, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
hours=setup.ENGINE.putInBounds(hours, 'recoverPassive-hours');
/* PASSIVE REGEN */
CHAR.MATRIX.tough += (CHAR.STATS.STR + CHAR.STATS.END)/2 * hours;
CHAR.MATRIX.power += (CHAR.STATS.STR + CHAR.STATS.SPD)/2 * hours;
CHAR.MATRIX.vigor += (CHAR.STATS.STR + CHAR.STATS.PHY)/2 * hours;
CHAR.MATRIX.skill += (CHAR.STATS.STR + CHAR.STATS.INS)/2 * hours;
CHAR.MATRIX.train += (CHAR.STATS.STR + CHAR.STATS.WSD)/2 * hours;
CHAR.MATRIX.regen += (CHAR.STATS.END + CHAR.STATS.SPD)/2 * hours;
CHAR.MATRIX.vital += (CHAR.STATS.END + CHAR.STATS.PHY)/2 * hours;
CHAR.MATRIX.force += (CHAR.STATS.END + CHAR.STATS.INS)/2 * hours;
CHAR.MATRIX.guard += (CHAR.STATS.END + CHAR.STATS.WSD)/2 * hours;
CHAR.MATRIX.metab += (CHAR.STATS.SPD + CHAR.STATS.PHY)/2 * hours;
CHAR.MATRIX.fight += (CHAR.STATS.SPD + CHAR.STATS.INS)/2 * hours;
CHAR.MATRIX.react += (CHAR.STATS.SPD + CHAR.STATS.WSD)/2 * hours;
CHAR.MATRIX.focus += (CHAR.STATS.PHY + CHAR.STATS.INS)/2 * hours;
CHAR.MATRIX.aware += (CHAR.STATS.PHY + CHAR.STATS.WSD)/2 * hours;
CHAR.MATRIX.psych += (CHAR.STATS.INS + CHAR.STATS.WSD)/2 * hours;
/* METABOLC BONUS FROM FOOD */
CHAR.MATRIX.vital += setup.ENGINE.sqrt(CHAR.MATRIX.regen, '-')*hours; CHAR.MATRIX.tough += setup.ENGINE.sqrt(CHAR.MATRIX.regen/2, '-')*hours;
CHAR.MATRIX.vigor += setup.ENGINE.sqrt(CHAR.MATRIX.metab, '-')*hours; CHAR.MATRIX.power += setup.ENGINE.sqrt(CHAR.MATRIX.metab/2, '-')*hours;
var base=0;
var amt=0;
var units = hours/360;
var regen = setup.ENGINE.pow(CHAR.MATRIX.regen, 1/3, '-');
var protein = 0;
Object.keys(CHAR.BODY).forEach(function(part) {
base=CHAR.BODY[part].damage + (CHAR.BODY[part].train * CHAR.STATS.caliber)+regen;
protein=Math.min(CHAR.MATRIX.protein, base);
CHAR.MATRIX.protein-=(protein/30);
amt = Math.min( CHAR.BODY[part].damage, units*(1 + setup.ENGINE.sqrt(3*(base+protein), '-')/100) );
CHAR.BODY[part].damage -= Math.max(amt, 0);
CHAR.BODY[part].train = Math.min( (CHAR.BODY[part].train + (amt/CHAR.STATS.caliber)), (CHAR.STATS.caliber) );
});
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 = (F_CHAR.STATS.STR).toFixed(2);
F_CHAR.end = (F_CHAR.STATS.END).toFixed(2);
F_CHAR.spd = (F_CHAR.STATS.SPD).toFixed(2);
F_CHAR.phy = (F_CHAR.STATS.PHY).toFixed(2);
F_CHAR.ins = (F_CHAR.STATS.INS).toFixed(2);
F_CHAR.wsd = (F_CHAR.STATS.WSD).toFixed(2);
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);
},
'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.gameVersion,
'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;
},
'short_menus' : function(LIST, wrap, cls, ATTR) { LIST=LIST||setup.MENU; wrap=wrap||'li'; cls=cls||'keypress'; ATTR=ATTR||{}; return setup.ENGINE.list_menus(LIST, 'short', wrap, cls, ATTR ); },
'show_as_menu' : function(passage) {
$('#menu').html('');
$('#menu').wiki(Story.get(passage).processText());
$('#menu').show();
},
'show_menu' : function(menu) {
return setup.ENGINE.show_as_menu(setup.MENU[menu].passage);
},
'showSideBar' : function() {
$('#sidebar').show(200);
$('#datetime').show(200);
$('#feedback').show(200);
},
'slaveCard' : function(slave_id, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
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 class='details'>
<span>Age: "+ SLAVE.age +"</span>
<span>Gender: "+ SLAVE.gender +"</span>
<span>Caught: "+ setup.ENGINE.getDate(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>fat: "+ setup.ENGINE.char_metric('bodyfat', SLAVE) +"</span>
<span>muscle: "+ setup.ENGINE.char_metric('bodytone', SLAVE) +"</span>
<span>level: "+ SLAVE.STATS.level.toFixed(0) +" . . . caliber: "+ SLAVE.STATS.caliber.toFixed(0) +"</span>
<span>bicep: "+ setup.ENGINE.char_metric('bicep', SLAVE) +"</span>
<span>quads: "+ setup.ENGINE.char_metric('quads', SLAVE) +"</span>
<span>Qi: "+ SLAVE.MATRIX.qi.toFixed(0) +" / "+ SLAVE.STATS.max_qi.toFixed(0) +"</span>
<span>STR: "+ SLAVE.STATS.STR.toFixed(2) +"</span>
<span>END: "+ SLAVE.STATS.END.toFixed(2) +"</span>
<span>SPD: "+ SLAVE.STATS.SPD.toFixed(2) +"</span>
<span>PHY: "+ SLAVE.STATS.PHY.toFixed(2) +"</span>
<span>INS: "+ SLAVE.STATS.INS.toFixed(2) +"</span>
<span>WSD: "+ SLAVE.STATS.WSD.toFixed(2) +"</span>
</div>
</div>
</div>
<div class='bottom_bar glass'>
<span class='link'>
<<link '[INTERACT WITH]' >>
<<set _slave='"+ slave_id +"';>>
<<run setup.ENGINE.show_menu('slaves'); >>
<</link>>
</span>
</div>
</div>
";
},
'slaveFeed' : function(slave_id, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
setup.ENGINE.giveFeedback('Feed Slave... not yet implemented');
},
'slaveDress' : function(slave_id, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
setup.ENGINE.giveFeedback('Dress Slave... not yet implemented');
},
'slaveFight' : function(slave_id, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
setup.ENGINE.giveFeedback('[re-]Fight Slave... not yet implemented');
},
'slaveFree' : function(slave_id, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
setup.ENGINE.giveFeedback('Free Slave... not yet implemented');
},
'slaveInteractions' : function(slave_id, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
var SLAVE = CHAR.SLAVES[slave_id];
return "
<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 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>fat: "+ setup.ENGINE.char_metric('bodyfat', SLAVE) +"</span>
<span>muscle: "+ setup.ENGINE.char_metric('bodytone', SLAVE) +"</span>
<span>level: "+ SLAVE.STATS.level.toFixed(0) +" . . . caliber: "+ SLAVE.STATS.caliber.toFixed(0) +"</span>
<span>bicep: "+ setup.ENGINE.char_metric('bicep', SLAVE) +"</span>
<span>quads: "+ setup.ENGINE.char_metric('quads', SLAVE) +"</span>
<span>Qi: "+ SLAVE.MATRIX.qi.toFixed(0) +" / "+ SLAVE.STATS.max_qi.toFixed(0) +"</span>
<span>STR: "+ SLAVE.STATS.STR.toFixed(2) +"</span>
<span>END: "+ SLAVE.STATS.END.toFixed(2) +"</span>
<span>SPD: "+ SLAVE.STATS.SPD.toFixed(2) +"</span>
<span>PHY: "+ SLAVE.STATS.PHY.toFixed(2) +"</span>
<span>INS: "+ SLAVE.STATS.INS.toFixed(2) +"</span>
<span>WSD: "+ SLAVE.STATS.WSD.toFixed(2) +"</span>
</div>
<div>"+ setup.ENGINE.listConditions(SLAVE) +"</div>
</div>
</div>
<div class='bottom_bar glass'>
<span class='link'>
<<link '[FEED]' >>
<<run setup.ENGINE.slaveFeed( '" + slave_id + ", "+ CHAR +"');>>
<<replace '#feedback'>><<include 'FEEDBACK'>><</replace>>
<</link>>
</span>
<span class='link'>
<<link '[DRESS]' >>
<<run setup.ENGINE.slaveDress( '" + slave_id + ", "+ CHAR +"');>>
<<replace '#feedback'>><<include 'FEEDBACK'>><</replace>>
<</link>>
</span>
<span class='link'>
<<link '[TALK]' >>
<<run setup.ENGINE.slaveTalk( '" + slave_id + ", "+ CHAR +"');>>
<<replace '#feedback'>><<include 'FEEDBACK'>><</replace>>
<</link>>
</span>
<span class='link'>
<<link '[FIGHT]'>>
<<run setup.ENGINE.slaveFight('" + slave_id + ", "+ CHAR +"');>>
<<replace '#feedback'>><<include 'FEEDBACK'>><</replace>>
<</link>>
</span>
<span class='link'>
<<link '[USE]'>>
<<run setup.ENGINE.slaveUse('" + slave_id + ", "+ CHAR +"');>>
<<replace '#feedback'>><<include 'FEEDBACK'>><</replace>>
<</link>>
</span>
<span class='link'>
<<link '[PUNISH]'>>
<<run setup.ENGINE.slavePunish('" + slave_id + ", "+ CHAR +"');>>
<<replace '#feedback'>><<include 'FEEDBACK'>><</replace>>
<</link>>
</span>
<span class='link'>
<<link '[TRAIN]'>>
<<run setup.ENGINE.slaveTrain('" + slave_id + ", "+ CHAR +"');>>
<<replace '#feedback'>><<include 'FEEDBACK'>><</replace>>
<</link>>
</span>
<span class='link'>
<<link '[PLAY AS]'>>
<<run setup.ENGINE.slavePlayAs('" + slave_id + ", "+ CHAR +"');>>
<<replace '#feedback'>><<include 'FEEDBACK'>><</replace>>
<</link>>
</span>
<span class='link'>
<<link '[SET FREE]'>>
<<run setup.ENGINE.slaveFree('" + slave_id + ", "+ CHAR +"');>>
<<replace '#feedback'>><<include 'FEEDBACK'>><</replace>>
<</link>>
</span>
</div>
<div class='bottom_bar no-glass'>
<<linkreplace 'CHECK MUSCLETONE'>><<print setup.ENGINE.listMuscleStatus($GAMEDATA.PC.SLAVES['"+ slave_id +"']);>><</linkreplace>>
</div>
</div>
";
},
'slavePlayAs' : function(slave_id, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
setup.ENGINE.giveFeedback('Play As... not yet implemented');
},
'slavePunish' : function(slave_id, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
setup.ENGINE.giveFeedback('Punish Slave... not yet implemented');
},
'slaveTalk' : function(slave_id, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
setup.ENGINE.giveFeedback('Talk to Slave... not yet implemented');
},
'slaveTrain' : function(slave_id, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
setup.ENGINE.giveFeedback('Train Slave... not yet implemented');
},
'slaveUse' : function(slave_id, CHAR) {
CHAR=CHAR||$GAMEDATA.PC;
setup.ENGINE.giveFeedback('Use Slave... not yet implemented');
},
'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; },
'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) {
WHO.captured = new Date;
$GAMEDATA.PC.SLAVES[WHO.name] = 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;
/* WORKOUT UNIQUE CODE: STR(END) END(SPD) SPD(PHY) PHY(INS) WSD(INS) STAT INCREASE FOR EFFORT */
CHAR.STATS.STR += ( -( (act.tough||0) + (act.power||0) + (act.vigor||0) + (act.skill||0) + (act.train||0) )*effort /(cost*CHAR.STATS.STR));
CHAR.STATS.END += ( -( (act.tough||0) + (act.regen||0) + (act.vital||0) + (act.force||0) + (act.guard||0) )*effort /(cost*CHAR.STATS.END));
CHAR.STATS.SPD += ( -( (act.power||0) + (act.regen||0) + (act.metab||0) + (act.fight||0) + (act.react||0) )*effort /(cost*CHAR.STATS.SPD));
CHAR.STATS.PHY += ( -( (act.vigor||0) + (act.vital||0) + (act.metab||0) + (act.focus||0) + (act.aware||0) )*effort /(cost*CHAR.STATS.PHY));
CHAR.STATS.INS += ( -( (act.skill||0) + (act.force||0) + (act.fight||0) + (act.focus||0) + (act.psych||0) )*effort /(cost*CHAR.STATS.INS));
CHAR.STATS.WSD += ( -( (act.train||0) + (act.guard||0) + (act.react||0) + (act.aware||0) + (act.psych||0) )*effort /(cost*CHAR.STATS.WSD));
},
'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, CHAR) {
CHAR=CHAR||$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(!CHAR.STUFF[item_id]) { return false; }
if(('all'==qty)||('*'==qty)) { qty=CHAR.STUFF[item_id]; }
setup.ENGINE.before_use(item_id, qty, CHAR);
CHAR.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);
break;
case 'consumable':
var iMAT = ITEM.MATRIX;
setup.ENGINE.doEnergyMATRIX(iMAT, qty);
break;
default:
/* or just put it on the mantle to look at */
}
/* Adjust the clock */
setup.ENGINE.addSeconds(10 * qty / CHAR.STATS.SPD);
/* load item MATRIX */
/* setup.ENGINE.doEnergyMATRIX(MATRIX, units); */
setup.ENGINE.after_use(item_id, qty, CHAR);
/* clean up inventory */
if(CHAR.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 thisUpdate = CHAR.STATE.Date.getTime();
var hoursPassed = (thisUpdate - (CHAR.WORLD.lastUpdate || thisUpdate)) / (60*60*1000);
CHAR.WORLD.amazonIndex=CHAR.WORLD.girlPower/10;
setup.ENGINE.update_slaves(CHAR);
CHAR.WORLD.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(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 gender = (TARGET.gender || TARGET.TRAITS.gender).toLowerCase();
if(TARGET.dead) {
switch(gender) {
case 'female': case 'futa':
TARGET.dead = false;
TARGET.CoD = null;
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;
case 'male': case 'none':
default:
/* nope... not strong enough to come back... */
return '';
break;
}
}
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.16, 3.4)*TARGET.STATS.caliber)*0.42;
TARGET.BODY[key].damage -= regrow;
TARGET.BODY[key].train += (regrow/TARGET.STATS.caliber) + (setup.ENGINE.rand(1.34, 3.4)*(amt/3));
TARGET.BODY[key].train = Math.min(TARGET.BODY[key].train, TARGET.STATS.caliber+0.1);
}
});
switch(true) {
case (TARGET.METRICS.age<19):
var age_plus = 19-TARGET.METRICS.age;
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=19;
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>24):
var age_minus = Math.ceil((TARGET.METRICS.age-19)/10);
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;
}
setup.ENGINE.qiAdd($GAMEDATA.PC.STATS.max_qi*3, TARGET);
TARGET.stun = false;
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 += ', serging 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.PC.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/16, cCal);
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*3))) || TARGET.dead ) ) {
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(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, 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':"...", },
'hygene' :{ 'type':"hygene" , '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':"HYGENE",
'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 HYGENE */
'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.0,
'END' : 5.0,
'SPD' : 5.0,
'PHY' : 5.0,
'level' : 5.0,
'workout_hrs': 0.1,
'karmic_well': 12,
},
'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':{
'thin':"",
'depressed':"",
'tired':"",
},
'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':{},
'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; },
},
},
'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; },
},
},
'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; },
},
},
'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='[ESC]'>[[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); },
},
},
/* 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; },
},
},
'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='[ESC]'>[[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 4; },
},
},
/*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='[ESC]'>[[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 HYGENE' :{
'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( '_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 BUMBER (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 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.08): 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.25): out+='You got the back tires up before your muscles gave out...' + setup.ENCOUNTERS.car_MASTER.CHOICES.whatDoYouDo(); break;
case (reps< 0.50): 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.00): 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.00): 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.00): 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.00): 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.00): 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' : (CHAR.STATS.STR).toFixed(2),
'end' : (CHAR.STATS.END).toFixed(2),
'spd' : (CHAR.STATS.SPD).toFixed(2),
'phy' : (CHAR.STATS.PHY).toFixed(2),
'ins' : (CHAR.STATS.INS).toFixed(2),
'wsd' : (CHAR.STATS.WSD).toFixed(2),
'level' : (CHAR.STATS.level).toFixed(0),
'caliber' : (CHAR.STATS.caliber).toFixed(0),
'actor' : 'player',
'BODY' : CHAR.BODY,
'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);
State.setVar( '_P1', P1 );
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 P2Stats = setup.ENGINE.generateRandomEncounterStats(_LICENSE);
var P2Matrix = setup.ENGINE.generateRandomEncounterMatrix(P2Stats, min, max);
var P2Body = setup.ENGINE.new_BODY(1, P2Stats.caliber);
var P2={
'name' : _LICENSE.name,
'name_first' : _LICENSE.name.split(' ')[0],
'age' : _LICENSE.age,
'gender' : _LICENSE.gender,
'genpro' : _LICENSE.genpro,
'ht' : setup.ENGINE.formatHeight(_LICENSE.ht),
'wt' : setup.ENGINE.formatWeight(_LICENSE.adj_wt),
'str' : (P2Stats.STR).toFixed(2),
'end' : (P2Stats.END).toFixed(2),
'spd' : (P2Stats.SPD).toFixed(2),
'phy' : (P2Stats.PHY).toFixed(2),
'ins' : (P2Stats.INS).toFixed(2),
'wsd' : (P2Stats.WSD).toFixed(2),
'level' : (P2Stats.level).toFixed(0),
'caliber' : (P2Stats.caliber).toFixed(0),
'actor' : 'cpu',
'STATS' : P2Stats,
'MATRIX' : P2Matrix,
'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,
},
'TRAITS' : {
'gender' : _LICENSE.gender,
},
'STATUS' : {},
'BODY' : P2Body,
};
P2.STATS['karmic_well'] = setup.ENGINE.calcKarmicWell(P2.STATS);
P2.STATS['max_qi'] = P2Matrix['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 */
'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,
'level' : 10.00,
'workout_hrs': 0.917,
'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':{
'overweight':"",
'depressed':"",
'bruised':"",
'tired':"",
},
'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':{},
'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>Tired of his shit, of getting hit for the thousandth time, you finally leave that asshole...</p>
<p>with no car, you catch a bus to another city to start a new life with little more than $200 in your pocket.</p>
<p>You find a cheap motel and rent a room for the night...</p>
<<run setup.ENGINE.setTime(21,1)>>
<p>You've got a lot to do tomorrow, perhaps you should [[go to bed->SLEEP IN BED]].</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='[ESC]'>[[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='[ESC]'>[[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||90;
/* 4x, take the lowest, should generate realistic age frequencies, tending toward the lower-middle range */
var roll = Math.min(Math.random(), Math.random(), Math.random(), Math.random());
return Math.round(roll*(max-min)+min);
},
'randomHeight' : function(base, variance) {
base=base||66;
variance=variance||42;
/* 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||450;
/* 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);
},
'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',
'Andrea',
'Andreas',
'Andres',
'Andrew',
'Andy',
'Angel',
'Angelo',
'Anibal',
'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',
'Brain',
'Branden',
'Brandon',
'Brant',
'Brendan',
'Brendon',
'Brent',
'Brenton',
'Bret',
'Brett',
'Brian',
'Brice',
'Britt',
'Brock',
'Broderick',
'Brooks',
'Bruce',
'Bruno',
'Bryan',
'Bryant',
'Bryce',
'Bryon',
'Buck',
'Bud',
'Buddy',
'Buford',
'Burl',
'Burt',
'Burton',
'Buster',
'Byron',
'Caleb',
'Calvin',
'Cameron',
'Carey',
'Carl',
'Carlo',
'Carlos',
'Carlton',
'Carmelo',
'Carmen',
'Carmine',
'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',
'Cristobal',
'Cristopher',
'Cruz',
'Curt',
'Curtis',
'Cyril',
'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',
'Elisha',
'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',
'Ezekiel',
'Ezequiel',
'Ezra',
'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',
'Gale',
'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',
'Joan',
'Joaquin',
'Jody',
'Joe',
'Joel',
'Joesph',
'Joey',
'John',
'Johnathan',
'Johnathon',
'Johnny',
'Johnson',
'Jon',
'Jonah',
'Jonas',
'Jonathan',
'Jonathon',
'Jordan',
'Jordon',
'Jorge',
'Jose',
'Josef',
'Joseph',
'Josh',
'Joshua',
'Josiah',
'Jospeh',
'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',
'Kim',
'King',
'Kip',
'Kirby',
'Kirk',
'Korey',
'Kory',
'Kraig',
'Kris',
'Kristofer',
'Kristopher',
'Kurt',
'Kurtis',
'Kyle',
'Lacy',
'Lamar',
'Lamont',
'Lance',
'Landon',
'Lane',
'Lanny',
'Larry',
'Lauren',
'Laurence',
'Lavern',
'Laverne',
'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',
'Shirley',
'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',
'Agnus',
'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',
'France',
'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',
'Hedwig',
'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',
'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>STR:</th><th>_P1.str</th> <th>SPD:</th><th>_P1.spd</th> </tr>
<tr> <th>END:</th><th>_P1.end</th> <th>INS:</th><th>_P1.ins</th> </tr>
<tr> <th>PHY:</th><th>_P1.phy</th> <th>WSD:</th><th>_P1.wsd</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>
<div class='energy-matrix half-glass'>
<<print setup.ENGINE.getResource('tough', _P1) >>
<<print setup.ENGINE.getResource('power', _P1) >>
<<print setup.ENGINE.getResource('vigor', _P1) >>
<<print setup.ENGINE.getResource('skill', _P1) >>
<<print setup.ENGINE.getResource('train', _P1) >>
<<print setup.ENGINE.getResource('regen', _P1) >>
<<print setup.ENGINE.getResource('vital', _P1) >>
<<print setup.ENGINE.getResource('force', _P1) >>
<<print setup.ENGINE.getResource('guard', _P1) >>
<<print setup.ENGINE.getResource('metab', _P1) >>
<<print setup.ENGINE.getResource('fight', _P1) >>
<<print setup.ENGINE.getResource('react', _P1) >>
<<print setup.ENGINE.getResource('focus', _P1) >>
<<print setup.ENGINE.getResource('aware', _P1) >>
<<print setup.ENGINE.getResource('psych', _P1) >>
</div>
</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>STR:</th><th>_P2.str</th> <th>SPD:</th><th>_P2.spd</th> </tr>
<tr> <th>END:</th><th>_P2.end</th> <th>INS:</th><th>_P2.ins</th> </tr>
<tr> <th>PHY:</th><th>_P2.phy</th> <th>WSD:</th><th>_P2.wsd</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>
<div class='energy-matrix half-glass'>
<<print setup.ENGINE.getResource('tough', _P2) >>
<<print setup.ENGINE.getResource('power', _P2) >>
<<print setup.ENGINE.getResource('vigor', _P2) >>
<<print setup.ENGINE.getResource('skill', _P2) >>
<<print setup.ENGINE.getResource('train', _P2) >>
<<print setup.ENGINE.getResource('regen', _P2) >>
<<print setup.ENGINE.getResource('vital', _P2) >>
<<print setup.ENGINE.getResource('force', _P2) >>
<<print setup.ENGINE.getResource('guard', _P2) >>
<<print setup.ENGINE.getResource('metab', _P2) >>
<<print setup.ENGINE.getResource('fight', _P2) >>
<<print setup.ENGINE.getResource('react', _P2) >>
<<print setup.ENGINE.getResource('focus', _P2) >>
<<print setup.ENGINE.getResource('aware', _P2) >>
<<print setup.ENGINE.getResource('psych', _P2) >>
</div>
</div>
<div>
<h4>CONDITION:</h4>
<<print setup.ENGINE.listConditions(_P2); >>
</div><<if !_P1.stun && !_P2.gone>><div class='action keypress' key='1' title='don't hold back...'><<link 'PUNCH'>>
<<prepend '#combat_log'>>
<div class='btl_evt'>
<div class='btl_msg'>
<<if !_P1.stun>>
<<run
/* P1 ATTACK */
_p1atk = _P1.MATRIX.power * Math.random() * 3;
_p1dmg = Math.ceil(Math.abs(Math.max(1, (_p1atk -Math.max(0,_P2.MATRIX.tough)) )));
_P2.MATRIX.tough -= Math.abs(Math.max(1, _p1atk/10 ));
setup.ENGINE.qiAdd(- _p1dmg, _P2);
_P1.STATS.STR+=0.0016 + ( !_P2.dead ? (_P2.STATS.STR/10000) * Math.random() * 3 : -0.001 );
_P1.STATS.PHY+=0.0034;
_P1.STATS.INS+=0.0034;
>>
<<run setup.ENGINE.qiFlow(0.1, 1, _P2); setup.ENGINE.do_status_update(_P2); >>
<span class='hit_msg'>_P1.name <<print either('hit', 'punched', 'smacked', 'thrashed', 'hammered', 'backfisted', 'decked', 'uppercut', 'jabbed', 'hooked', 'threw a cross at')>> _P2.name for _p1dmg damage.</span>
<span class='cnd_msg'>_P2.name <<print setup.ENGINE.fighterCondition(_P2); >></span>
<<else>>
<<run setup.ENGINE.qiFlow(0.1, 1, _P2); setup.ENGINE.do_status_update(_P2); >>
<span class='cnd_msg'>_P1.name isn't able to fight back.</span>
<</if>>
</div>
<div class='btl_msg'>
<<if !_P2.stun>>
<<run
/* P2 ATTACK */
_p2atk = _P2.MATRIX.power * Math.random() * 3;
_p2dmg = Math.ceil(Math.abs(Math.max(1, (_p2atk -Math.max(0,_P1.MATRIX.tough)) )));
_P1.MATRIX.tough -= Math.abs(Math.max(1, _p2atk/10 ));
setup.ENGINE.qiAdd(- _p2dmg, _P1);
setup.ENGINE.darkAdd(10+setup.ENGINE.sqrt(_p1dmg/10, '+'), _P1);
setup.ENGINE.darkAdd(10+setup.ENGINE.sqrt(_p2dmg/10, '+'), _P2);
_P1.STATS.END+=0.0016 + ( (_p2dmg/10000) * Math.random() * 3 );
_P1.STATS.SPD+=0.0034;
_P1.STATS.WSD+=0.0034;
>>
<<run setup.ENGINE.qiFlow(0.1, 1, _P1); setup.ENGINE.do_status_update(_P1); >>
<span class='hit_msg'>_P2.name <<print either('hit', 'punched', 'smacked', 'thrashed', 'hammered', 'backfisted', 'decked', 'uppercut', 'jabbed', 'hooked', 'threw a cross at')>> _P1.name for _p2dmg damage.</span>
<span class='cnd_msg'>_P1.name <<print setup.ENGINE.fighterCondition(_P1); >></span>
<<else>>
<<run setup.ENGINE.qiFlow(0.1, 1, _P1); setup.ENGINE.do_status_update(_P1); >>
<span class='cnd_msg'>_P2.name isn't able to fight back.</span>
<<run
if(!_hasKilled && _P2.dead) {
_hasKilled=true;
setup.ENGINE.darkAdd(10000, _P1);
}
>>
<</if>>
</div>
</div>
<</prepend>>
<<run setup.ENGINE.refresh_fighter_info(_P1); >>
<<replace '#combat_p1'>><<include 'COMBAT P1'>><</replace>>
<<replace '#combat_p2'>><<include 'COMBAT P2'>><</replace>>
<<replace '#combat_act'>><<include 'ACTIONS COMBAT'>><</replace>>
<</link>></div><</if>>
<<if !_P1.stun && !_P2.gone>><div class='action keypress' key='2' title='full fury...'><<link 'KICK'>>
<<prepend '#combat_log'>>
<div class='btl_evt'>
<div class='btl_msg'>
<<if !_P1.stun>>
<<run
/* P1 ATTACK */
_p1atk = _P1.MATRIX.power * Math.random() * 3 *3;
_p1dmg = Math.ceil(Math.abs(Math.max(1, (_p1atk -Math.max(0,_P2.MATRIX.tough)) )));
_P2.MATRIX.tough -= Math.abs(Math.max(1, _p1atk/10 ));
setup.ENGINE.qiAdd(- _p1dmg, _P2);
_P1.STATS.STR+=0.0016 + ( !_P2.dead ? (_P2.STATS.STR/10000) * (Math.random()+0.01) : -0.001 );
_P1.STATS.PHY+=0.0034;
_P1.STATS.INS+=0.0034;
>>
<<run setup.ENGINE.qiFlow(0.1, 1, _P2); setup.ENGINE.do_status_update(_P2); >>
<span class='hit_msg'>_P1.name <<print either('kicked', 'kneed', 'struck', 'punted', 'roundhoused', 'dug a heel into', 'slammed into', 'whipped', 'smacked', 'hooked', 'racked', 'stomped')>> _P2.name for _p1dmg damage.</span>
<span class='cnd_msg'>_P2.name <<print setup.ENGINE.fighterCondition(_P2); >></span>
<<else>>
<<run setup.ENGINE.qiFlow(0.1, 1, _P2); setup.ENGINE.do_status_update(_P2); >>
<span class='cnd_msg'>_P1.name isn't able to fight back.</span>
<</if>>
</div>
<div class='btl_msg'>
<<if !_P2.stun>>
<<run
/* P2 ATTACK */
_p2atk = _P2.MATRIX.power * Math.random() * 3/2;
_p2dmg = Math.ceil(Math.abs(Math.max(1, (_p2atk -Math.max(0,_P1.MATRIX.tough)) )));
_P1.MATRIX.tough -= Math.abs(Math.max(1, _p2atk/10 ));
setup.ENGINE.qiAdd(- _p2dmg, _P1);
setup.ENGINE.darkAdd(10+setup.ENGINE.sqrt(_p1dmg/10, '+'), _P1);
setup.ENGINE.darkAdd(10+setup.ENGINE.sqrt(_p2dmg/10, '+'), _P2);
_P1.STATS.END+=0.0016 + ( (_p2dmg/10000) * (Math.random()+0.01) );
_P1.STATS.SPD+=0.0034;
_P1.STATS.WSD+=0.0034;
>>
<<run setup.ENGINE.qiFlow(0.1, 1, _P1); setup.ENGINE.do_status_update(_P1); >>
<span class='hit_msg'>_P2.name <<print either('hit', 'punched', 'smacked', 'thrashed', 'hammered', 'backfisted', 'decked', 'uppercut', 'jabbed', 'hooked', 'threw a cross at')>> _P1.name for _p2dmg damage.</span>
<span class='cnd_msg'>_P1.name <<print setup.ENGINE.fighterCondition(_P1); >></span>
<<else>>
<<run setup.ENGINE.qiFlow(0.1, 1, _P1); setup.ENGINE.do_status_update(_P1); >>
<span class='cnd_msg'>_P2.name isn't able to fight back.</span>
<<run
if(!_hasKilled && _P2.dead) {
_hasKilled=true;
setup.ENGINE.darkAdd(10000, _P1);
}
>>
<</if>>
</div>
</div>
<</prepend>>
<<run setup.ENGINE.refresh_fighter_info(_P1); >>
<<replace '#combat_p1'>><<include 'COMBAT P1'>><</replace>>
<<replace '#combat_p2'>><<include 'COMBAT P2'>><</replace>>
<<replace '#combat_act'>><<include 'ACTIONS COMBAT'>><</replace>>
<</link>></div><</if>>
<<if !_P1.stun && !_P2.gone>><div class='action keypress' key='3' title='try not to kill them...'><<link 'SLAP'>>
<<prepend '#combat_log'>>
<div class='btl_evt'>
<div class='btl_msg'>
<<if !_P1.stun>>
<<run
/* P1 ATTACK */
_p1atk = _P1.MATRIX.power * Math.random();
_p1dmg = Math.ceil(Math.abs(Math.max(1, Math.min(_p1atk -Math.max(0,_P2.MATRIX.tough*10), _P2.MATRIX.qi*1.5) )) /1.34);
_P2.MATRIX.tough -= Math.abs(Math.max(1, Math.min(_p1atk/34, _P2.MATRIX.tough) ));
setup.ENGINE.qiAdd(- _p1dmg, _P2);
_P1.STATS.STR+=0.0016 + ( !_P2.dead ? (_P2.STATS.STR/10000) * (Math.random()+0.01) : -0.001 );
_P1.STATS.PHY+=0.0034;
_P1.STATS.INS+=0.0034;
setup.ENGINE.qiAdd(34* setup.ENGINE.sqrt(_p1dmg, '0'), _P1);
>>
<<run setup.ENGINE.qiFlow(0.1, 1, _P2); setup.ENGINE.do_status_update(_P2); >>
<span class='hit_msg'>_P1.name <<print either('slapped', 'smacked', 'whacked', 'humiliated', 'backhanded', 'bitchslapped', 'slapped the shit out of')>> _P2.name for _p1dmg damage.</span>
<span class='cnd_msg'>_P2.name <<print setup.ENGINE.fighterCondition(_P2); >></span>
<<else>>
<<run setup.ENGINE.qiFlow(0.1, 1, _P2); setup.ENGINE.do_status_update(_P2); >>
<span class='cnd_msg'>_P1.name isn't able to fight back.</span>
<</if>>
</div>
<div class='btl_msg'>
<<if !_P2.stun>>
<<run setup.ENGINE.qiFlow(0.1, 1, _P1); setup.ENGINE.do_status_update(_P1); >>
<span class='hit_msg'>_P2.name looks at you shocked, then slaps you back....</span><br />
<<run
/* P2 ATTACK */
_p2atk = _P2.MATRIX.power * (Math.random()+0.34) * 0.34;
_p2dmg = Math.ceil(Math.abs(Math.max(1, (_p2atk -Math.max(0,_P1.MATRIX.tough)) )));
_P1.MATRIX.tough -= Math.abs(Math.max(1, _p2atk/10 ));
setup.ENGINE.qiAdd(- _p2dmg, _P1);
setup.ENGINE.darkAdd(10+setup.ENGINE.sqrt(_p1dmg/10, '+'), _P1);
setup.ENGINE.darkAdd(10+setup.ENGINE.sqrt(_p2dmg/10, '+'), _P2);
_P1.STATS.END+=0.0016 + ( (_p2dmg/10000) * Math.random() * 3 );
_P1.STATS.SPD+=0.0034;
_P1.STATS.WSD+=0.0034;
>>
<<run setup.ENGINE.qiFlow(0.1, 1, _P1); setup.ENGINE.do_status_update(_P1); >>
<span class='hit_msg'>_P2.name <<print either('slapped', 'smacked', 'whacked', 'humiliated', 'backhanded', 'bitchslapped', 'slapped the shit out of')>> _P1.name for _p2dmg damage.</span>
<span class='cnd_msg'>_P1.name <<print setup.ENGINE.fighterCondition(_P1); >></span>
<<else>>
<<run setup.ENGINE.qiFlow(0.1, 1, _P1); setup.ENGINE.do_status_update(_P1); >>
<span class='cnd_msg'>_P2.name isn't able to fight back.</span>
<</if>>
</div>
</div>
<</prepend>>
<<run setup.ENGINE.refresh_fighter_info(_P1); >>
<<replace '#combat_p1'>><<include 'COMBAT P1'>><</replace>>
<<replace '#combat_p2'>><<include 'COMBAT P2'>><</replace>>
<<replace '#combat_act'>><<include 'ACTIONS COMBAT'>><</replace>>
<</link>></div><</if>>
<<if _P2.stun && !_P2.gone>><div class='action'><<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>></div><</if>>
<<if _P2.stun && !_P2.gone>><div class='action'><<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>></div><</if>>
<<if _P2.stun && !_took_wallet && !_P2.gone>><div class='action'><<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>></div><</if>>
<<if _P2.stun && !_took_cash && !_P2.gone>><div class='action'><<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>></div><</if>>
<<if _P2.stun && !_P2.kidnapped && !_P2.gone>><div class='action' title='you could always use another slave...'><<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>></div><</if>>
<<if _P2.stun && !_P2.gone>><div class='action'><<if !_P2.dead && ( _P2.STATS.max_qi>30 || ( _P2.METRICS.ht>1 && settings.mac_heightGain ) )>><<link '[TEST: FEED]'>>
<<run
setup.ENGINE.darkAdd(1000, _P1);
_drain_pct = 0.16*setup.ENGINE.rand(0.01, 0.69);
_drain_qi = _drain_pct*_P2.STATS.max_qi;
setup.ENGINE.powerTransfer(_P2, _P1, _drain_pct, {'xfer_height':true});
setup.ENGINE.qiAdd(-_drain_qi, _P2);
setup.ENGINE.qiAdd(_drain_qi, _P1);
_P2.drained=true;
setup.ENGINE.qiFlow(0.1, 1, _P2); setup.ENGINE.do_status_update(_P2);
setup.ENGINE.qiFlow(0.1, 1, _P1); setup.ENGINE.do_status_update(_P1);
setup.ENGINE.refresh_fighter_info(_P1);
setup.ENGINE.refresh_fighter_info(_P2);
>>
<<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>>
<<replace '#combat_p1'>><<include 'COMBAT P1'>><</replace>>
<<replace '#combat_p2'>><<include 'COMBAT P2'>><</replace>>
<<replace '#combat_act'>><<include 'ACTIONS COMBAT'>><</replace>>
<</link>><<else>><a title='nothing left to take...' class='disabled'>[TEST: FEED]</a><</if>></div><</if>>
<<if _P2.stun && !_P2.gone>><div class='action'><<link '[TEST: HEAL]'>>
<<run
/* WTF twine/sugarcube/ecmascript? how is this shit going negative? [ +*+*+ != - ] , dumbass */
_focus_used = (_P1.MATRIX.focus * 0.69*setup.ENGINE.rand(0.1, 1.0));
_heal_amt = (_focus_used*setup.ENGINE.rand(1.34, 6.42));
_P1.MATRIX.focus -= _focus_used;
setup.ENGINE.qiAdd(_heal_amt, _P2);
setup.ENGINE.qiAdd(-_heal_amt, _P1);
_P2.healed=true;
setup.ENGINE.lightAdd((_heal_amt+_focus_used)/3, _P1);
setup.ENGINE.qiFlow(0.1, 1, _P2); setup.ENGINE.do_status_update(_P2);
setup.ENGINE.qiFlow(0.1, 1, _P1); setup.ENGINE.do_status_update(_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()<(_P1.STATS.caliber*setup.ENGINE.rand(0.34,3.4))>>
<<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 && (_P2.MATRIX.qi>(_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
_P2.dead = false;
_P2.CoD = null;
_P2.stun = false;
_P2.MATRIX.qi*=1.5;
setup.ENGINE.do_status_update(_P2); setup.ENGINE.refresh_fighter_info(_P2);
setup.ENGINE.do_status_update(_P1); setup.ENGINE.refresh_fighter_info(_P1);
>>
<<elseif (_P2.dead)>>
<<set _P2.MATRIX.qi=Math.min(_P2.MATRIX.qi, 0)>>
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>>
<<replace '#combat_p1'>><<include 'COMBAT P1'>><</replace>>
<<replace '#combat_p2'>><<include 'COMBAT P2'>><</replace>>
<<replace '#combat_act'>><<include 'ACTIONS COMBAT'>><</replace>>
<</link>></div><</if>>
<<if _P2.stun>><div class='action'><<link 'LEAVE'>><<run
setup.ENGINE.showSideBar();
setup.ENGINE.giveFeedback('An exhilarating fight! You did well.');
setup.ENGINE.powerTransfer(_P2, _P1, 0.034);
>><<goto 'GO HOME'>><</link>></div><</if>>
<<if _P1.stun>><div class='action' title='not good...'><<link 'CONTINUE'>><<run
_P1.stun=false;
setup.ENGINE.showSideBar();
setup.ENGINE.giveFeedback('you were defeated' + (_P1.dead ? '... and killed.' : ', somehow you made it back home...'));
>><<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': -12.00, 'qi': -1.00, 'karma': -6.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': -80.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': -150.00, 'power': -220.00, 'vigor': -120.00, 'skill': -48.00, 'train': -54.00, 'regen': -20.00, 'vital': -30.00, 'force': -15.00, 'guard': -30.00, 'metab': -40.00, 'fight': -30.00, 'react': -25.00, 'focus': -24.00, 'aware': -14.00, 'psych': -10.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': -220.00, 'power': -170.00, 'vigor': -340.00, 'skill': -18.00, 'train': -15.00, 'regen': -90.00, 'vital': -120.00, 'force': -90.00, 'guard': -60.00, 'metab': -120.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': -190.00, 'power': -300.00, 'vigor': -280.00, 'skill': -30.00, 'train': -27.00, 'regen': -40.00, 'vital': -70.00, 'force': -90.00, 'guard': -60.00, 'metab': -90.00, 'fight': -60.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.hide_menu();
>>
<</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.show_menu('slaves');>>
<</link>></p>
<</if>><<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.listWorkouts_forArea(_area); >>
<p class='keypress' key='[ESC]'><<link 'RETURN'>><<unset _area>><<print setup.ENGINE.reloadPassage();>><</link>></p>
<<else>>
<<if !_load>>
_workout
<<print setup.ENGINE.listLoads_forWorkout(_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>><<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': 21.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, 'Brain': 1.00} },
'Circuit (Core)': {'area': 'routines', 'action': 'weightlifting', 'units': 'workouts', 'pbw': 0.50, 'pls': 1.00, 'total': 8.00, 'MATRIX':{'Hips': 1.00, 'LoBack': 1.00, 'Abs': 3.00, 'Cardio': 1.00, 'Kegel': 1.00, 'Brain': 1.00} },
'Circuit (Lower)': {'area': 'routines', 'action': 'weightlifting', 'units': 'workouts', 'pbw': 0.50, 'pls': 1.20, 'total': 4.00, 'MATRIX':{'Calves': 1.00, 'Quads': 1.00, 'Hams': 1.00, 'Glutes': 1.00} },
'Circuit (Upper)': {'area': 'routines', 'action': 'weightlifting', 'units': 'workouts', 'pbw': 0.50, 'pls': 0.80, 'total': 12.00, 'MATRIX':{'Lats': 1.00, 'Traps': 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} },
'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': 10.00, 'MATRIX':{'Hams': 1.00, 'Glutes': 3.00, 'LoBack': 5.00, 'Cardio': 1.00} },
'Crunch': {'area': 'pt bars', 'action': 'calisthenics', 'units': 'reps', 'pbw': 0.50, 'pls': 1.60, 'total': 13.00, 'MATRIX':{'Hips': 1.00, 'LoBack': 1.00, 'Abs': 7.00, 'Cardio': 1.00, 'Kegel': 3.00} },
'Dips': {'area': 'pt bars', 'action': 'calisthenics', 'units': 'reps', 'pbw': 1.00, 'pls': 0.55, 'total': 22.00, 'MATRIX':{'Lats': 3.00, 'Traps': 1.00, 'Abs': 1.00, 'Pecs': 1.00, 'Delts': 3.00, 'LeftTri': 5.00, 'RightTri': 5.00, 'LeftFore': 1.00, 'RightFore': 1.00, 'Cardio': 1.00} },
'Leg Raise': {'area': 'pt bars', 'action': 'calisthenics', 'units': 'reps', 'pbw': 0.50, 'pls': 0.50, 'total': 9.00, 'MATRIX':{'Hips': 5.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': 14.00, 'MATRIX':{'Quads': 5.00, 'Hams': 3.00, 'Glutes': 3.00, 'Hips': 3.00} },
'Pull-up': {'area': 'pt bars', 'action': 'calisthenics', 'units': 'reps', 'pbw': 1.00, 'pls': 0.50, 'total': 29.00, 'MATRIX':{'Lats': 7.00, 'Traps': 1.00, 'Pecs': 5.00, 'Delts': 5.00, 'LeftBi': 3.00, 'RightBi': 3.00, 'LeftFore': 1.00, 'RightFore': 1.00, 'LeftGrip': 1.00, 'RightGrip': 1.00, 'Cardio': 1.00} },
'Push-up': {'area': 'pt bars', 'action': 'calisthenics', 'units': 'reps', 'pbw': 0.75, 'pls': 1.10, 'total': 15.00, 'MATRIX':{'Abs': 1.00, 'Pecs': 7.00, 'Delts': 1.00, 'LeftTri': 3.00, 'RightTri': 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': 47.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': 1.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': 22.00, 'MATRIX':{'Pecs': 7.00, 'Delts': 1.00, 'LeftTri': 3.00, 'RightTri': 3.00, 'LeftFore': 1.00, 'RightFore': 1.00, 'LeftGrip': 1.00, 'RightGrip': 1.00, 'Cardio': 1.00, 'Kegel': 3.00} },
'Bent-over Row': {'area': 'lifts', 'action': 'weightlifting', 'units': 'reps', 'pbw': 0.00, 'pls': 0.70, 'total': 9.00, 'MATRIX':{'Lats': 3.00, 'Traps': 1.00, 'LeftBi': 1.00, 'RightBi': 1.00, 'LeftFore': 1.00, 'RightFore': 1.00, 'Cardio': 1.00} },
'Biceps Curl': {'area': 'lifts', 'action': 'weightlifting', 'units': 'reps', 'pbw': 0.00, 'pls': 0.50, 'total': 16.00, 'MATRIX':{'LeftBi': 7.00, 'RightBi': 7.00, 'LeftFore': 1.00, 'RightFore': 1.00} },
'Calf Raise': {'area': 'lifts', 'action': 'weightlifting', 'units': 'reps', 'pbw': 1.00, 'pls': 1.40, 'total': 7.00, 'MATRIX':{'Calves': 7.00} },
'Chest Fly': {'area': 'lifts', 'action': 'weightlifting', 'units': 'reps', 'pbw': 0.00, 'pls': 1.10, 'total': 9.00, 'MATRIX':{'Pecs': 5.00, 'Delts': 1.00, 'LeftFore': 1.00, 'RightFore': 1.00, 'Cardio': 1.00} },
'Deadlift': {'area': 'lifts', 'action': 'weightlifting', 'units': 'reps', 'pbw': 0.00, 'pls': 1.00, 'total': 31.00, 'MATRIX':{'Calves': 1.00, 'Quads': 3.00, 'Hams': 3.00, 'Glutes': 3.00, 'Hips': 3.00, 'LoBack': 7.00, 'Traps': 1.00, 'Abs': 1.00, 'LeftFore': 1.00, 'RightFore': 1.00, 'LeftGrip': 3.00, 'RightGrip': 3.00, 'Cardio': 1.00} },
'Lateral Raise': {'area': 'lifts', 'action': 'weightlifting', 'units': 'reps', 'pbw': 0.25, 'pls': 0.40, 'total': 14.00, 'MATRIX':{'Traps': 3.00, 'Abs': 1.00, 'Pecs': 1.00, 'Delts': 7.00, 'LeftGrip': 1.00, 'RightGrip': 1.00} },
'Leg Curl': {'area': 'lifts', 'action': 'weightlifting', 'units': 'reps', 'pbw': 0.00, 'pls': 0.70, 'total': 9.00, 'MATRIX':{'Calves': 1.00, 'Hams': 5.00, 'Kegel': 3.00} },
'Leg Extension': {'area': 'lifts', 'action': 'weightlifting', 'units': 'reps', 'pbw': 0.00, 'pls': 1.00, 'total': 3.00, 'MATRIX':{'Quads': 3.00} },
'Leg Press': {'area': 'lifts', 'action': 'weightlifting', 'units': 'reps', 'pbw': 0.25, 'pls': 2.00, 'total': 15.00, 'MATRIX':{'Calves': 1.00, 'Quads': 5.00, 'Hams': 1.00, 'Glutes': 7.00, 'Cardio': 1.00} },
'Military Press': {'area': 'lifts', 'action': 'weightlifting', 'units': 'reps', 'pbw': 0.00, 'pls': 0.60, 'total': 21.00, 'MATRIX':{'Quads': 1.00, 'Traps': 3.00, 'Abs': 1.00, 'Delts': 7.00, 'LeftTri': 3.00, 'RightTri': 3.00, 'LeftFore': 1.00, 'RightFore': 1.00, 'Cardio': 1.00} },
'Pull-down': {'area': 'lifts', 'action': 'weightlifting', 'units': 'reps', 'pbw': 0.00, 'pls': 0.80, 'total': 15.00, 'MATRIX':{'Lats': 7.00, 'Pecs': 3.00, 'Delts': 1.00, 'LeftBi': 1.00, 'RightBi': 1.00, 'LeftFore': 1.00, 'RightFore': 1.00} },
'Shoulder Shrug': {'area': 'lifts', 'action': 'weightlifting', 'units': 'reps', 'pbw': 0.00, 'pls': 1.00, 'total': 12.00, 'MATRIX':{'Traps': 7.00, 'Delts': 1.00, 'LeftFore': 1.00, 'RightFore': 1.00, 'LeftGrip': 1.00, 'RightGrip': 1.00} },
'Squat': {'area': 'lifts', 'action': 'weightlifting', 'units': 'reps', 'pbw': 1.00, 'pls': 1.50, 'total': 26.00, 'MATRIX':{'Calves': 1.00, 'Quads': 5.00, 'Hams': 1.00, 'Glutes': 7.00, 'Hips': 3.00, 'LoBack': 1.00, 'Traps': 1.00, 'Abs': 3.00, 'Cardio': 1.00, 'Kegel': 3.00} },
'Triceps Extension': {'area': 'lifts', 'action': 'weightlifting', 'units': 'reps', 'pbw': 0.00, 'pls': 0.55, 'total': 16.00, 'MATRIX':{'LeftTri': 7.00, 'RightTri': 7.00, 'LeftFore': 1.00, 'RightFore': 1.00} },
'Upright Row': {'area': 'lifts', 'action': 'weightlifting', 'units': 'reps', 'pbw': 0.00, 'pls': 0.70, 'total': 18.00, 'MATRIX':{'Traps': 7.00, 'Delts': 5.00, 'LeftBi': 1.00, 'RightBi': 1.00, 'LeftFore': 1.00, 'RightFore': 1.00, 'LeftGrip': 1.00, 'RightGrip': 1.00} },
'Wrist Curl': {'area': 'lifts', 'action': 'weightlifting', 'units': 'reps', 'pbw': 0.00, 'pls': 0.30, 'total': 16.00, 'MATRIX':{'LeftFore': 7.00, 'RightFore': 7.00, 'LeftGrip': 1.00, 'RightGrip': 1.00} },
/* END setup.WORKOUTS */}>><<set setup.MENU={
'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, [[better have look around->GO HOME]].</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,
'level' : 120.00,
'workout_hrs': 1.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':{},
'SLAVES':{},
'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('EXPLORE', 'search', 30/60) >>[[LOOK FOR CHANGE]]<</if>></p>
<p class='narrow'><<if setup.ENGINE.canDo('TRAIN', 'walk', 120/60) >>[[WALK SOMEWHERE]]<</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'>[[GYM]]</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.hide_menu();
>>
<</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.show_menu('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('STR')>>:</th> <th><<print ($GAMEDATA.PC.STATS.STR).toFixed(3)>></th> </tr>
<tr> <th><<print setup.ENGINE.karmic_link('END')>>:</th> <th><<print ($GAMEDATA.PC.STATS.END).toFixed(3)>></th> </tr>
<tr> <th><<print setup.ENGINE.karmic_link('SPD')>>:</th> <th><<print ($GAMEDATA.PC.STATS.SPD).toFixed(3)>></th> </tr>
<tr> <th><<print setup.ENGINE.karmic_link('PHY')>>:</th> <th><<print ($GAMEDATA.PC.STATS.PHY).toFixed(3)>></th> </tr>
<tr> <th><<print setup.ENGINE.karmic_link('INS')>>:</th> <th><<print ($GAMEDATA.PC.STATS.INS).toFixed(3)>></th> </tr>
<tr> <th><<print setup.ENGINE.karmic_link('WSD')>>:</th> <th><<print ($GAMEDATA.PC.STATS.WSD).toFixed(3)>></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 />
<div class='energy-matrix half-glass'>
<<print setup.ENGINE.getResource('tough') >>
<<print setup.ENGINE.getResource('power') >>
<<print setup.ENGINE.getResource('vigor') >>
<<print setup.ENGINE.getResource('skill') >>
<<print setup.ENGINE.getResource('train') >>
<<print setup.ENGINE.getResource('regen') >>
<<print setup.ENGINE.getResource('vital') >>
<<print setup.ENGINE.getResource('force') >>
<<print setup.ENGINE.getResource('guard') >>
<<print setup.ENGINE.getResource('metab') >>
<<print setup.ENGINE.getResource('fight') >>
<<print setup.ENGINE.getResource('react') >>
<<print setup.ENGINE.getResource('focus') >>
<<print setup.ENGINE.getResource('aware') >>
<<print setup.ENGINE.getResource('psych') >>
</div>
</div>
<div>
<h4>CONDITION:</h4>
<<print setup.ENGINE.listConditions(); >>
</div>
</div>