|
|
|
@ -12,7 +12,7 @@ Current version indicated by LITEVER below.
|
|
|
|
|
-->
|
|
|
|
|
|
|
|
|
|
<script>
|
|
|
|
|
const LITEVER = 238;
|
|
|
|
|
const LITEVER = 239;
|
|
|
|
|
const urlParams = new URLSearchParams(window.location.search);
|
|
|
|
|
var localflag = urlParams.get('local'); //this will be replaced automatically in embedded kcpp
|
|
|
|
|
const STORAGE_PREFIX = (localflag?"e_":"")+"kaihordewebui_";
|
|
|
|
@ -57,9 +57,11 @@ Current version indicated by LITEVER below.
|
|
|
|
|
--img_paper:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgBAMAAACBVGfHAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAAnQAAAJ0Bj3LnbgAAAB5QTFRF+OmvAAAA89Ze14Rw2cCY1k8/8eGhmEQ/+uqj87Jse3RL9AAAAAp0Uk5T/wD49//9of8rH/vnQeUAAAEOSURBVHicXdG9asMwFAXggx1COmoJ8VgNptkKcmqyGaKSB0i127RkLiTgNV2CVxMo9G177rVSm2ow0se5Vz/Gbdub6YBz2//w0sV59s0wbs5X806X1j4JFN4Bx45La9eE7OM1PANIBHKCuW7CAYgkkIWgEaWeYN5DjHA0AthIZF8ILAgrpBJJ21N1hyGCXXvGA2EJibxJQaVwgUQKlNIkj5AePNKyrWAJtYS952dH6AlpJaQViW3AXc/shlnZFoRHAhd6hpkjrLGEl7lShFKuphXgA0B23WtF+UmwCjy1VijUw70H4iPeH0KaIMl/DKZjIf/lWo/QCJjVSAMYUoSvCH80gjHdEZibCQjJJuYXZ+xAP6Rjil4AAAAASUVORK5CYII=");
|
|
|
|
|
--img_dice:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAAnQAAAJ0Bj3LnbgAAAGlQTFRF2gA3AAAArgAs9O7ptwAu2gI45Fp63y5a8+rm8t3czgA0xgAy3RtM7bG74Txk53qSsQAttQAurwAs8dLU6Yyf3tfT5WmFsAAs2gA3wqqrsBM6uhxD2gA32wA22gA30hdGsiRHt1Rq2gA3GZfQSAAAACN0Uk5T/wD//////////////////3QL3f////+22v///3AK+v///7M1XKlYAAABCElEQVR4nKWT63rCIAyG2xCggD1bD1On7v4vcgnForWVZ8++P22SF5JAyPKEsjy/nA/f2VwOALqmZeDy8xZlWSRk3xJwXowTQQA0BBzY2ujNa5gcPgsBnH/XF6aWMSxrU/Q7TkIA470QotAR0AU5+usEeFuoCCjhV+C0g2FHFYGKbcNVjEBW0xbb5xq2tEHNjQRAalU9xclRKU0OfABr+jsgVVkq+QFQ1I5RH4CS2yv/AyRTJIucKZ7kilzqqDFxWXacB7d63acRALsyMMMtAGgXR244fgUAwC0M7XC8wwh09MHrbOzt6cbr/dg3/APobIw6hCB+OO0+GPgQTPJPL2+bDhYVHm9Cv52hDBGSdP+eAAAAAElFTkSuQmCC");
|
|
|
|
|
--img_chat:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAA7AAAAOwBeShxvQAAADxQTFRFkcPmAAAAkcPmstXukL/ltNbueJGic4aTibLQkcPmvtzwpM7qmazZkcPm5vL5ps/ruNnw0uf1udD/////pH/0JgAAABR0Uk5T/wBl/xH0////Qrz8Bltj6diDAgFfSBG4AAAAzklEQVR4nL3TQQ6EIAwF0BYLSBFl9P53HUFhVKru5i/QpC+2CRWQOOpLIo9YAqQ9tJmqAJbqAFyBFuugK+hk0P0b9Mb05/MCjLUGwOZzexeBuQe9senjdmth2xbykEoFR89gJfQClHsD4eGyMlDAMmCkHYziPvixAhzjvlO+K9FxXShXAOKcB/VMJTPWegaYgP/gLwOVegVTqishO9i2+Bbw/h+Eth7g0LkOdog7AWoBnQDS5RvpuvGcZcjZ4JIWBuXkbvgAkMILWOdx6fEFbukIF0RE9j4AAAAASUVORK5CYII=");
|
|
|
|
|
--img_chat_mono:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAA7AAAAOwBeShxvQAAADxQTFRFu7u7AAAAu7u70NDQurq60dHRjY2Ng4ODu7u7rKys19fXxsbG7+/vubm5u7u709PTyMjI4+Pj3Nzc////jB2o5QAAABR0Uk5T/wBl/xH0//9C/7z8YwZb2OmDAgHH4NesAAAAzklEQVR4nL3Tyw6EIAwF0BbLw6Lg6P//6wgKo1J1N3eBJj2xTaiAxFFfEnnAEiDtoc1UBbBUB+AKtFgHXUEng+7foDemP58XYKw1ADaf27sIzD3ojU0ft1sL27aQh1QqOHoGK6EXoNwbCA+XlYEClgEj7WAQ98EPFeAQ953yXYmO60K5AhDnPKhnKpmx1jPABPwHfxmp1CuYUl0J2cG2xbeA9/8gtPUAh851sEPcCVAL6ASQLt9I143nLGPOBpe0MCgnd8MHgBRewDqPS48vawEIEy7Qd5cAAAAASUVORK5CYII=");
|
|
|
|
|
--img_compass:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAA7AAAAOwBeShxvQAAADxQTFRF/7VV/+J5AAAA8/P11Ob1l8jt/39K+chs/9tn/8Bd/+J48eTO/9x0/9Zv99ugiHp0/5MKWVFO/6k53KWUcJJTdwAAABR0Uk5T/v8A//////8Zydn/klf///v/bf9A3eYXAAABMUlEQVR4nG2T2RaDIAwFUwEBWdz+/18LuSypNS8enTGQQGgZ4VKMW4kYHb9fnnxaaOC4fUZsxbmoxHFRx5/f2BJRkY4Dgts+f2F9AU0Q3Aol9Qyd56DUvisVMlw6Dt5D5wVDKArzusdaBfaXlZqCUrlyiksRnORKt6dioRRCSND5CK1Z8Au5vn5Y1yy4zkhBaSRYS9yh85YiURwF3CtHbhwpPHGN/FuAsN7gOjwF1bhpAtYg7tnO5Wdww8Z+nn+CapyFswtiibJN5sbIJaQQGjdyk7PMWr8RRisziU7zj0OwaBRaPTkU0ep5WPo3+mGN437wedxIYS2+n7vkvl4YvnLl3Qb0Z1TICRZcWvg2Q8B1A8dkJXqNtHTh3cCE9tHzT+zB5/Am/4aFUAe4OT66+fULsfQP1birKzkAAAAASUVORK5CYII=");
|
|
|
|
|
--img_websearch:url('data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAN1wAADdcBQiibeAAAAEtQTFRFAAAA////////////////////////////////////////////////////////////////////////////////////////////////g5kLBwAAABl0Uk5TAP8Ds+QtpRpgIn35Ud7vnMFxhNZFkswMPA2JIJgAAAFISURBVHicvZPbjsQgCIb5PdVT1dpW+/5PutTZncwp6V4NSasGBD4BoruI6E1LqRkfBb1LX2bcZV76i1r4dCoS1hW3nX/y0uW4aBbUiiWPg3xwMjU+Fxgy2DZedhS+0aa7Xp23MXeaQ+9BUV/5CKg/C7b2nKFxEwpRgZs4iPLs9aa3QKVtJA8Zo8TA2agCdgRIkIIyrJXhl7LYiExCIk30FdFakHbUtXO6k9MPO6H1gDxOdgvPiYoURMTu4alh0gN0wcKMLkNHVA0cFZuG6QxpB6eDqSXYdaYeyrIqL5MQao6p5R0Dc22lthx2jqZMlvwjfpZc9lbayHIPYdsTjjNaslx39hu53jYkPww2JE4siTPamVjgOveAYwL0MBAMeX4D+RftBq+/89D/KfdVw1y33HXTXrb99eB8Gr36OsBPw6vehnd4+Tj+P8K7EihG+ntRAAAAAElFTkSuQmCC');
|
|
|
|
|
--img_save:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAAnQAAAJ0Bj3LnbgAAADxQTFRFQlFtSVp52uHyws7lztbmjpmuUdjlu8TZeIminqi9WvH/rrjNVMbYxuT0Xm2HAAAAR1h3RVVyR1ZyR1h2eZplWQAAABR0Uk5T////////////////////ANT0HUjqAr+PAAAAgUlEQVR4nI3Q2RaDIAxF0RuCDNUWKP//ryXFWkUczmP2ghVAjkTklOQAvLT28R1CgMwbQCoC6oBIH4ocAOIR4BYoZtZboOHbKHlaQw3rTsFNNVObFjCP2gzmGvhZ47k/qOUdW7An4IdfDbAt+dLYgJbkR+zdq/YnYn+rhBxT2kPKH1FvCKEBnt/sAAAAAElFTkSuQmCC");
|
|
|
|
|
--img_save_mono:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAAnQAAAJ0Bj3LnbgAAADxQTFRFV1dXYWFh5eXl09PT2tram5ubnp6ejY2Nra2tysrKrKysvb29lpaWW1tbcnJy3d3dAAAAX19fXFxcXl5eL2vTkwAAABR0Uk5T//////////////////T//wDUHUizGkTXAAAAgUlEQVR4nI3QURKDIAxF0RcCAlUqlP3vtaRYq4jW+5kzMAHkRERWSRbAU2uXXjFGyLwBhCKgDoj0ocgJIJ0BboFiZr0HGj6NkqMt1LDtEuxUM7VpBfOoLWD+A881XvqBWt+xB38BbvjWAPuSK40NaEl+xN+96ngi9bcKyCmEI4T8BipnCJv9iKHqAAAAAElFTkSuQmCC");
|
|
|
|
|
--img_load:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAAnQAAAJ0Bj3LnbgAAADxQTFRF8MQZKbmZ8p0fAAAA8bIc8MIa8MQZq7NIKrmY7cQa0sIs8d2BebRn87wcLL+aJrmZ//8AdbhpAP//c69phZ/jMwAAABR0Uk5T//3/AP+y8v6kbP///xcZUAGrAUn40tQBAAAAp0lEQVR4nHWSiw6DIAwAy1peojLd///rKm3ZZOOiCXLpBRIhB2CCf+JeXUr1RAECATGQ+WN3TFUBKsJmJu0ijOCZo5m7EJzVRrE2c3ZBhoiXCXoYsYm4qejbUSbWo94HXCfZALXF0kVWQVAKP6Xo/hK0RHZcmVnAa+lzketYESBb6dvwPmxDqdX49TiWlIw/JeG6+ViCVsJZCWclnJVwVkLwfwau/+INBncEwpxiohQAAAAASUVORK5CYII=");
|
|
|
|
|
--img_delete:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAAnQAAAJ0Bj3LnbgAAADxQTFRF////AAAA////////////////////////////////////////////////////////////////////////npt1BAAAABR0Uk5T/wB3M/ryVkUE3GQ8bhvOlb+s6oPyVnGNAAAAt0lEQVR4nHWR2RaDIBBDGXZlVf//X8sMsQtt88BxuJpIUDTVrBLZhg1F0WutL/XUNUYfB/Dqh/Z/wA9AbLVIrIjMlySc6FyNHMC2gg2grqAC9BV0gIOHs4+z2y55B0DjvELJuUDFLYDzUsCfNAApKs/ustQFkFHP0C6PGkAmxz4j536HgdQYplWwUuEEAeF7xmkDgOGbSxyVo+EvEkCZzT0XZT7AmwpAXEEEWOutdANT7WvbVo6gB7iKBNvL+guBAAAAAElFTkSuQmCC");
|
|
|
|
|
--img_download:url("data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAABgAAAAYCAMAAADXqc3KAAAAAXNSR0IB2cksfwAAAAlwSFlzAAAOxAAADsQBlSsOGwAAADxQTFRFAAAA////////////+f783ffv/v//3ffv3ffv5Pnz8fz56vr16/r23ffv9v377/v4////3vfw5Pny3ffvbBfD6AAAABR0Uk5TAP+TRfsGWm8m6uDv0U/LfyiIepVDO0gQAAAAbElEQVR4nNWPuQ6AIBAFF+S+j///V0FjWJTEwsqpyEzxFoBXKGnQvwcuQw9B8kkLIRzrgbn2ROGQFwwFbYe3GgUfR4gejyRqzg1D0+2q2gszdb6ql9x2bH54AFW0Lmrxc1BSPvw2gQKZ+BQW7MaRAtfJQ2l0AAAAAElFTkSuQmCC");
|
|
|
|
@ -1874,6 +1876,27 @@ Current version indicated by LITEVER below.
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
margin-top: 16px;
|
|
|
|
|
padding: 2px;
|
|
|
|
|
height: calc(100% - 20px);
|
|
|
|
|
}
|
|
|
|
|
.corpoleftpanelitemsinner
|
|
|
|
|
{
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
padding: 2px;
|
|
|
|
|
overflow-y: auto;
|
|
|
|
|
overflow-x: hidden;
|
|
|
|
|
text-overflow: ellipsis;
|
|
|
|
|
display: inline-block;
|
|
|
|
|
margin: 2px;
|
|
|
|
|
margin-top: 4px;
|
|
|
|
|
margin-bottom: 4px;
|
|
|
|
|
}
|
|
|
|
|
.corpoleftpanelitemstopper
|
|
|
|
|
{
|
|
|
|
|
display: flex;
|
|
|
|
|
flex-direction: column;
|
|
|
|
|
padding: 2px;
|
|
|
|
|
display: inline-block;
|
|
|
|
|
}
|
|
|
|
|
.corpo_leftpanel_btn
|
|
|
|
|
{
|
|
|
|
@ -1889,9 +1912,9 @@ Current version indicated by LITEVER below.
|
|
|
|
|
background-size: 24px;
|
|
|
|
|
overflow: hidden;
|
|
|
|
|
text-overflow: ellipsis;
|
|
|
|
|
display: inline-block;
|
|
|
|
|
white-space: nowrap;
|
|
|
|
|
user-select: none;
|
|
|
|
|
width: 100%;
|
|
|
|
|
}
|
|
|
|
|
.corpo_leftpanel_btn:hover {
|
|
|
|
|
background: #9dcef5;
|
|
|
|
@ -1899,6 +1922,13 @@ Current version indicated by LITEVER below.
|
|
|
|
|
background-position: 8px;
|
|
|
|
|
background-size: 24px;
|
|
|
|
|
}
|
|
|
|
|
.corpo_leftpanel_btn.red:hover {
|
|
|
|
|
color: #000000;
|
|
|
|
|
background: #f5767f;
|
|
|
|
|
background-repeat: no-repeat;
|
|
|
|
|
background-position: 8px;
|
|
|
|
|
background-size: 24px;
|
|
|
|
|
}
|
|
|
|
|
.corpo_leftpanel_btn:active {
|
|
|
|
|
transform: translateY(1px);
|
|
|
|
|
}
|
|
|
|
@ -1910,6 +1940,14 @@ Current version indicated by LITEVER below.
|
|
|
|
|
background-position: 8px;
|
|
|
|
|
background-size: 24px;
|
|
|
|
|
}
|
|
|
|
|
body.darkmode .corpo_leftpanel_btn.red:hover
|
|
|
|
|
{
|
|
|
|
|
color: #000000;
|
|
|
|
|
background: #f5767f;
|
|
|
|
|
background-repeat: no-repeat;
|
|
|
|
|
background-position: 8px;
|
|
|
|
|
background-size: 24px;
|
|
|
|
|
}
|
|
|
|
|
.corporightpanel
|
|
|
|
|
{
|
|
|
|
|
width: 100%;
|
|
|
|
@ -3078,6 +3116,7 @@ Current version indicated by LITEVER below.
|
|
|
|
|
var temp_scenario = null;
|
|
|
|
|
var last_token_budget = ""; //to display token limits
|
|
|
|
|
var last_known_filename = "saved_story.json";
|
|
|
|
|
var last_used_saveslot = -1; //used for corpo mode quicksave
|
|
|
|
|
var backup_localmodeport = 5001; //sometimes we reattempt a different port, this stores a backup
|
|
|
|
|
var localmodeport = 5001;
|
|
|
|
|
var localmodehost = "localhost";
|
|
|
|
@ -4233,9 +4272,8 @@ Current version indicated by LITEVER below.
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function replace_search_placeholders(text) {
|
|
|
|
|
|
|
|
|
|
// Remove any instruct tags as needed to ensure a more accurate search
|
|
|
|
|
function remove_all_instruct_tags(text)
|
|
|
|
|
{
|
|
|
|
|
text = replaceAll(text, get_instruct_starttag(false), "");
|
|
|
|
|
text = replaceAll(text, get_instruct_endtag(false), "");
|
|
|
|
|
text = replaceAll(text, get_instruct_systag(false), "");
|
|
|
|
@ -4245,6 +4283,12 @@ Current version indicated by LITEVER below.
|
|
|
|
|
text = text.replace(/\{\{\[INPUT\]\}\}/g, "").replace(/\{\{\[OUTPUT\]\}\}/g, "");
|
|
|
|
|
text = text.replace(/\{\{\[INPUT_END\]\}\}/g, "").replace(/\{\{\[OUTPUT_END\]\}\}/g, "");
|
|
|
|
|
text = text.replace(/\{\{\[SYSTEM\]\}\}/g, "").replace(/\{\{\[SYSTEM_END\]\}\}/g, "");
|
|
|
|
|
return text;
|
|
|
|
|
}
|
|
|
|
|
function replace_search_placeholders(text) {
|
|
|
|
|
|
|
|
|
|
// Remove any instruct tags as needed to ensure a more accurate search
|
|
|
|
|
text = remove_all_instruct_tags(text);
|
|
|
|
|
|
|
|
|
|
// Replace {{user}} and other placeholders
|
|
|
|
|
text = replace_placeholders(text);
|
|
|
|
@ -7363,7 +7407,10 @@ Current version indicated by LITEVER below.
|
|
|
|
|
if(usechatmode)
|
|
|
|
|
{
|
|
|
|
|
localsettings.opmode = 3;
|
|
|
|
|
if(localsettings.gui_type_chat!=3)
|
|
|
|
|
{
|
|
|
|
|
localsettings.gui_type_chat = 2;
|
|
|
|
|
}
|
|
|
|
|
gametext_arr.push("\n"+chatopponent+": "+greeting);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
@ -7425,7 +7472,10 @@ Current version indicated by LITEVER below.
|
|
|
|
|
gametext_arr.push("\n"+chatopponent+": "+greeting);
|
|
|
|
|
current_memory = memory + scenario + examplemsg + "\n***";
|
|
|
|
|
localsettings.opmode = 3;
|
|
|
|
|
if(localsettings.gui_type_chat!=3)
|
|
|
|
|
{
|
|
|
|
|
localsettings.gui_type_chat = 2;
|
|
|
|
|
}
|
|
|
|
|
update_for_sidepanel();
|
|
|
|
|
render_gametext(true);
|
|
|
|
|
sync_multiplayer(true);
|
|
|
|
@ -7743,7 +7793,10 @@ Current version indicated by LITEVER below.
|
|
|
|
|
current_memory = combinedmem;
|
|
|
|
|
}
|
|
|
|
|
localsettings.opmode = 3;
|
|
|
|
|
if(localsettings.gui_type_chat!=3)
|
|
|
|
|
{
|
|
|
|
|
localsettings.gui_type_chat = 2;
|
|
|
|
|
}
|
|
|
|
|
localsettings.chatopponent = chatopponent;
|
|
|
|
|
update_for_sidepanel();
|
|
|
|
|
render_gametext();
|
|
|
|
@ -7839,9 +7892,12 @@ Current version indicated by LITEVER below.
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
if (temp_scenario.opmode == 3) {
|
|
|
|
|
if(localsettings.gui_type_chat!=3)
|
|
|
|
|
{
|
|
|
|
|
if (temp_scenario.gui_type===1) { localsettings.gui_type_chat = 1; }
|
|
|
|
|
else if(temp_scenario.gui_type===2) { localsettings.gui_type_chat = 2; }
|
|
|
|
|
else if(temp_scenario.gui_type===0) { localsettings.gui_type_chat = 0; }
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (temp_scenario.multiline_replies===true) { localsettings.multiline_replies = true; }
|
|
|
|
|
else if(temp_scenario.multiline_replies===false) { localsettings.multiline_replies = false; }
|
|
|
|
@ -10402,6 +10458,27 @@ Current version indicated by LITEVER below.
|
|
|
|
|
document.getElementById("saveslotselecteddropdown").innerHTML = choices;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
function find_unused_saveslot(onDoneCallback)
|
|
|
|
|
{
|
|
|
|
|
let slotpromises = [];
|
|
|
|
|
for(let i=0;i<SAVE_SLOTS;++i)
|
|
|
|
|
{
|
|
|
|
|
slotpromises.push(indexeddb_load("slot_"+i+"_meta",""));
|
|
|
|
|
}
|
|
|
|
|
Promise.all(slotpromises).then(slotlabels=>
|
|
|
|
|
{
|
|
|
|
|
let esid = -1;
|
|
|
|
|
for(let i=0;i<slotlabels.length;++i)
|
|
|
|
|
{
|
|
|
|
|
if(slotlabels[i]=="")
|
|
|
|
|
{
|
|
|
|
|
esid = i;
|
|
|
|
|
break;
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
onDoneCallback(esid);
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
function display_saveloadcontainer()
|
|
|
|
|
{
|
|
|
|
|
mainmenu_untab(true);
|
|
|
|
@ -10442,7 +10519,43 @@ Current version indicated by LITEVER below.
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
function save_to_slot(slot,islocal)
|
|
|
|
|
function quicksave()
|
|
|
|
|
{
|
|
|
|
|
if(last_used_saveslot==-1)
|
|
|
|
|
{
|
|
|
|
|
if(!safe_to_overwrite())
|
|
|
|
|
{
|
|
|
|
|
find_unused_saveslot((slot)=>{
|
|
|
|
|
if(slot!=-1)
|
|
|
|
|
{
|
|
|
|
|
save_to_slot(slot,true,false);
|
|
|
|
|
}else
|
|
|
|
|
{
|
|
|
|
|
msgbox("Unable to Save - No Available New Slots.","Storage Slots Full");
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
msgbox("Nothing to save - Current session is empty.","Not Saved");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
save_to_slot(last_used_saveslot,true,false);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
function quickdelete()
|
|
|
|
|
{
|
|
|
|
|
if(last_used_saveslot!=-1)
|
|
|
|
|
{
|
|
|
|
|
delete_from_slot(last_used_saveslot,true,false);
|
|
|
|
|
}else
|
|
|
|
|
{
|
|
|
|
|
msgbox("Nothing to delete - Select a slot first.","No Action Taken");
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
function save_to_slot(slot,islocal,showcontainer)
|
|
|
|
|
{
|
|
|
|
|
let defaultsavename = (localsettings.opmode==1?"Untitled Story":(localsettings.opmode==2?"Untitled Adventure":(localsettings.opmode==3?"Untitled Chat":"Untitled Instruct")));
|
|
|
|
|
let savename = defaultsavename + " " + new Date().toLocaleString();
|
|
|
|
@ -10462,8 +10575,19 @@ Current version indicated by LITEVER below.
|
|
|
|
|
userinput = defaultsavename;
|
|
|
|
|
}
|
|
|
|
|
indexeddb_save("slot_" + slot + "_data", newcompressedstory)
|
|
|
|
|
indexeddb_save("slot_" + slot + "_meta", userinput).then(()=>{display_saveloadcontainer()});
|
|
|
|
|
indexeddb_save("slot_" + slot + "_meta", userinput).then(()=>{
|
|
|
|
|
if(showcontainer)
|
|
|
|
|
{
|
|
|
|
|
display_saveloadcontainer();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
saveloadchangeslot(true);
|
|
|
|
|
populate_corpo_leftpanel();
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
});
|
|
|
|
|
last_used_saveslot = slot;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if (testslot) {
|
|
|
|
@ -10482,6 +10606,7 @@ Current version indicated by LITEVER below.
|
|
|
|
|
}
|
|
|
|
|
const slotwrite = function () {
|
|
|
|
|
warn_unsaved = false;
|
|
|
|
|
last_used_saveslot = -1;
|
|
|
|
|
inputBox("Enter a label for this Server Storage Slot data", "Enter a label", savename, defaultsavename, () => {
|
|
|
|
|
let userinput = getInputBoxValue();
|
|
|
|
|
if (userinput.trim() == "") {
|
|
|
|
@ -10529,7 +10654,7 @@ Current version indicated by LITEVER below.
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
function load_from_slot(slot,islocal)
|
|
|
|
|
function load_from_slot(slot,islocal,switch_to_corpo)
|
|
|
|
|
{
|
|
|
|
|
const proceed_load_from_slot = function() {
|
|
|
|
|
if(islocal)
|
|
|
|
@ -10539,11 +10664,21 @@ Current version indicated by LITEVER below.
|
|
|
|
|
{
|
|
|
|
|
hide_popups();
|
|
|
|
|
import_compressed_story(loadedstorycompressed,false);
|
|
|
|
|
last_used_saveslot = slot;
|
|
|
|
|
if(switch_to_corpo)
|
|
|
|
|
{
|
|
|
|
|
localsettings.gui_type_chat = 3;
|
|
|
|
|
localsettings.gui_type_story = 3;
|
|
|
|
|
localsettings.gui_type_adventure = 3;
|
|
|
|
|
localsettings.gui_type_instruct = 3;
|
|
|
|
|
render_gametext(false,false);
|
|
|
|
|
}
|
|
|
|
|
}else{
|
|
|
|
|
msgbox("Unable to load story from browser storage","Browser Storage Load Failed");
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
} else {
|
|
|
|
|
last_used_saveslot = -1;
|
|
|
|
|
fetch(custom_kobold_endpoint + koboldcpp_savedata_load_endpoint, {
|
|
|
|
|
method: 'POST', // or 'PUT'
|
|
|
|
|
headers: get_kobold_header(),
|
|
|
|
@ -10627,15 +10762,32 @@ Current version indicated by LITEVER below.
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
function delete_from_slot(slot,islocal)
|
|
|
|
|
function delete_from_slot(slot,islocal,showcontainer)
|
|
|
|
|
{
|
|
|
|
|
let slotnumshown = (parseInt(slot)+1);
|
|
|
|
|
if (islocal) {
|
|
|
|
|
let postdel = function(){
|
|
|
|
|
if(showcontainer)
|
|
|
|
|
{
|
|
|
|
|
display_saveloadcontainer();
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
saveloadchangeslot(true);
|
|
|
|
|
populate_corpo_leftpanel();
|
|
|
|
|
}
|
|
|
|
|
};
|
|
|
|
|
msgboxYesNo("Delete story in Browser Storage Slot " + slotnumshown + "?", "Delete Browser Storage Slot " + slotnumshown, () => {
|
|
|
|
|
indexeddb_save("slot_" + slot + "_data", "");
|
|
|
|
|
indexeddb_save("slot_" + slot + "_meta", "").then(() => { display_saveloadcontainer() });
|
|
|
|
|
indexeddb_save("slot_" + slot + "_meta", "").then(() => {
|
|
|
|
|
postdel();
|
|
|
|
|
if(slot==last_used_saveslot)
|
|
|
|
|
{
|
|
|
|
|
last_used_saveslot = -1;
|
|
|
|
|
}
|
|
|
|
|
});
|
|
|
|
|
}, () => {
|
|
|
|
|
display_saveloadcontainer();
|
|
|
|
|
postdel();
|
|
|
|
|
});
|
|
|
|
|
} else {
|
|
|
|
|
msgboxYesNo("Delete story in Server Storage Slot " + slotnumshown + "?", "Delete Server Storage Slot " + slotnumshown, () => {
|
|
|
|
@ -10679,14 +10831,14 @@ Current version indicated by LITEVER below.
|
|
|
|
|
let selectedslot = document.getElementById("saveslotselecteddropdown").value;
|
|
|
|
|
let selectedlocation = document.getElementById("saveslotlocationdropdown").value;
|
|
|
|
|
let islocal = (selectedlocation=="1");
|
|
|
|
|
save_to_slot(selectedslot,islocal);
|
|
|
|
|
save_to_slot(selectedslot,islocal,true);
|
|
|
|
|
}
|
|
|
|
|
function load_from_curr_slot()
|
|
|
|
|
{
|
|
|
|
|
let selectedslot = document.getElementById("saveslotselecteddropdown").value;
|
|
|
|
|
let selectedlocation = document.getElementById("saveslotlocationdropdown").value;
|
|
|
|
|
let islocal = (selectedlocation=="1");
|
|
|
|
|
load_from_slot(selectedslot,islocal);
|
|
|
|
|
load_from_slot(selectedslot,islocal,false);
|
|
|
|
|
}
|
|
|
|
|
function download_from_curr_slot()
|
|
|
|
|
{
|
|
|
|
@ -10700,7 +10852,7 @@ Current version indicated by LITEVER below.
|
|
|
|
|
let selectedslot = document.getElementById("saveslotselecteddropdown").value;
|
|
|
|
|
let selectedlocation = document.getElementById("saveslotlocationdropdown").value;
|
|
|
|
|
let islocal = (selectedlocation=="1");
|
|
|
|
|
delete_from_slot(selectedslot,islocal);
|
|
|
|
|
delete_from_slot(selectedslot,islocal,true);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var cached_model_list = null;
|
|
|
|
@ -12203,6 +12355,12 @@ Current version indicated by LITEVER below.
|
|
|
|
|
if(selval=="0" || selval=="2" || selval=="3") //do not save any other value
|
|
|
|
|
{
|
|
|
|
|
localsettings.gui_type_instruct = selval;
|
|
|
|
|
if(selval=="3")
|
|
|
|
|
{
|
|
|
|
|
localsettings.gui_type_chat = selval;
|
|
|
|
|
localsettings.gui_type_story = selval;
|
|
|
|
|
localsettings.gui_type_adventure = selval;
|
|
|
|
|
}
|
|
|
|
|
render_gametext(true);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -12240,10 +12398,12 @@ Current version indicated by LITEVER below.
|
|
|
|
|
if (document.getElementById('opmode').value == 1) {
|
|
|
|
|
document.getElementById('gui_type').value = localsettings.gui_type_story;
|
|
|
|
|
document.getElementById('uipicker_aesthetic').classList.remove('hidden');
|
|
|
|
|
document.getElementById('uipicker_corpo').classList.remove('hidden');
|
|
|
|
|
}
|
|
|
|
|
if (document.getElementById('opmode').value == 2) {
|
|
|
|
|
document.getElementById('gui_type').value = localsettings.gui_type_adventure;
|
|
|
|
|
document.getElementById('uipicker_aesthetic').classList.remove('hidden');
|
|
|
|
|
document.getElementById('uipicker_corpo').classList.remove('hidden');
|
|
|
|
|
}
|
|
|
|
|
if (document.getElementById('opmode').value == 3) {
|
|
|
|
|
document.getElementById('gui_type').value = localsettings.gui_type_chat;
|
|
|
|
@ -12716,6 +12876,7 @@ Current version indicated by LITEVER below.
|
|
|
|
|
documentdb_data = "";
|
|
|
|
|
}
|
|
|
|
|
warn_unsaved = false;
|
|
|
|
|
last_used_saveslot = -1;
|
|
|
|
|
show_corpo_leftpanel(false);
|
|
|
|
|
update_toggle_lightmode(false); //load theme but dont save or toggle it
|
|
|
|
|
render_gametext(save); //necessary to trigger an autosave to wipe out current story in case they exit browser after newgame.
|
|
|
|
@ -17936,6 +18097,7 @@ Current version indicated by LITEVER below.
|
|
|
|
|
{
|
|
|
|
|
document.getElementById("inputrow").classList.remove("show_mode");
|
|
|
|
|
}
|
|
|
|
|
populate_corpo_leftpanel_topper();
|
|
|
|
|
|
|
|
|
|
if (gametext_arr.length == 0 && synchro_pending_stream=="" && pending_response_id=="") {
|
|
|
|
|
|
|
|
|
@ -18551,6 +18713,68 @@ Current version indicated by LITEVER below.
|
|
|
|
|
return turns;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function repack_adventure_history(input)
|
|
|
|
|
{
|
|
|
|
|
const regex = /\n\n> .+?\n/g;
|
|
|
|
|
const result = [];
|
|
|
|
|
let lastIndex = 0;
|
|
|
|
|
let match;
|
|
|
|
|
while ((match = regex.exec(input)) !== null) {
|
|
|
|
|
const start = match.index;
|
|
|
|
|
const end = regex.lastIndex;
|
|
|
|
|
|
|
|
|
|
if (start > lastIndex) {
|
|
|
|
|
// Opponent's turn (text before this match)
|
|
|
|
|
result.push({
|
|
|
|
|
msg: input.slice(lastIndex, start).trim(),
|
|
|
|
|
myturn: false
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// My turn
|
|
|
|
|
let mymsg = match[0].trim();
|
|
|
|
|
if(mymsg.startsWith("> "))
|
|
|
|
|
{
|
|
|
|
|
mymsg = mymsg.substring(2);
|
|
|
|
|
}
|
|
|
|
|
result.push({
|
|
|
|
|
msg: mymsg,
|
|
|
|
|
myturn: true
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
lastIndex = end;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Any remaining text after last match is opponent's turn
|
|
|
|
|
if (lastIndex < input.length) {
|
|
|
|
|
result.push({
|
|
|
|
|
msg: input.slice(lastIndex).trim(),
|
|
|
|
|
myturn: false
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Filter out empty messages
|
|
|
|
|
return result.filter(t => t.msg.length > 0);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function repack_story_history(input)
|
|
|
|
|
{
|
|
|
|
|
let arr = input.split("\n\n");
|
|
|
|
|
let result = [];
|
|
|
|
|
for(let i=0;i<arr.length;++i)
|
|
|
|
|
{
|
|
|
|
|
if(arr[i].trim()=="")
|
|
|
|
|
{
|
|
|
|
|
continue;
|
|
|
|
|
}
|
|
|
|
|
result.push({
|
|
|
|
|
msg: arr[i],
|
|
|
|
|
myturn: false
|
|
|
|
|
});
|
|
|
|
|
}
|
|
|
|
|
return result;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function corpo_chunk_prev()
|
|
|
|
|
{
|
|
|
|
|
let incomplete_resp = (synchro_pending_stream != "" || pending_response_id != "");
|
|
|
|
@ -18583,6 +18807,14 @@ Current version indicated by LITEVER below.
|
|
|
|
|
{
|
|
|
|
|
chatunits = repack_chat_history(currctx);
|
|
|
|
|
}
|
|
|
|
|
else if(localsettings.opmode==2)
|
|
|
|
|
{
|
|
|
|
|
chatunits = repack_adventure_history(currctx);
|
|
|
|
|
}
|
|
|
|
|
else if(localsettings.opmode==1)
|
|
|
|
|
{
|
|
|
|
|
chatunits = repack_story_history(currctx);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
chatunits = repack_instruct_history(currctx);
|
|
|
|
@ -18601,6 +18833,31 @@ Current version indicated by LITEVER below.
|
|
|
|
|
gametext_arr.push(chunk);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if(localsettings.opmode==2) //adventure mode
|
|
|
|
|
{
|
|
|
|
|
for(let i=0;i<=idx;++i)
|
|
|
|
|
{
|
|
|
|
|
let cont = chatunits[i].msg;
|
|
|
|
|
if(chatunits[i].myturn)
|
|
|
|
|
{
|
|
|
|
|
cont = `\n\n> ${cont}\n\n`;
|
|
|
|
|
}
|
|
|
|
|
gametext_arr.push(cont);
|
|
|
|
|
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if(localsettings.opmode==1) //story mode
|
|
|
|
|
{
|
|
|
|
|
for(let i=0;i<=idx;++i)
|
|
|
|
|
{
|
|
|
|
|
let cont = chatunits[i].msg;
|
|
|
|
|
if(i!=idx)
|
|
|
|
|
{
|
|
|
|
|
cont = `${cont}\n\n`;
|
|
|
|
|
}
|
|
|
|
|
gametext_arr.push(cont);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
@ -18666,6 +18923,14 @@ Current version indicated by LITEVER below.
|
|
|
|
|
{
|
|
|
|
|
chatunits = repack_chat_history(currctx);
|
|
|
|
|
}
|
|
|
|
|
else if(localsettings.opmode==2)
|
|
|
|
|
{
|
|
|
|
|
chatunits = repack_adventure_history(currctx);
|
|
|
|
|
}
|
|
|
|
|
else if(localsettings.opmode==1)
|
|
|
|
|
{
|
|
|
|
|
chatunits = repack_story_history(currctx);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
chatunits = repack_instruct_history(currctx);
|
|
|
|
@ -18700,6 +18965,37 @@ Current version indicated by LITEVER below.
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if(localsettings.opmode==2) //adventure mode
|
|
|
|
|
{
|
|
|
|
|
for(let i=0;i<chatunits.length;++i)
|
|
|
|
|
{
|
|
|
|
|
let cont = (i==idx?newtxt:chatunits[i].msg);
|
|
|
|
|
if(cont!="")
|
|
|
|
|
{
|
|
|
|
|
let chunk = cont;
|
|
|
|
|
if(chatunits[i].myturn)
|
|
|
|
|
{
|
|
|
|
|
chunk = `\n\n> ${chunk}\n\n`;
|
|
|
|
|
}
|
|
|
|
|
gametext_arr.push(chunk);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else if(localsettings.opmode==1) //story mode
|
|
|
|
|
{
|
|
|
|
|
for(let i=0;i<chatunits.length;++i)
|
|
|
|
|
{
|
|
|
|
|
let cont = (i==idx?newtxt:chatunits[i].msg);
|
|
|
|
|
if(cont!="")
|
|
|
|
|
{
|
|
|
|
|
if(i<chatunits.length-1)
|
|
|
|
|
{
|
|
|
|
|
cont = `${cont}\n\n`;
|
|
|
|
|
}
|
|
|
|
|
gametext_arr.push(cont);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
else //instruct and the rest
|
|
|
|
|
{
|
|
|
|
|
let ste = "";
|
|
|
|
@ -18767,6 +19063,14 @@ Current version indicated by LITEVER below.
|
|
|
|
|
{
|
|
|
|
|
chatunits = repack_chat_history(input);
|
|
|
|
|
}
|
|
|
|
|
else if(localsettings.opmode==2)
|
|
|
|
|
{
|
|
|
|
|
chatunits = repack_adventure_history(input);
|
|
|
|
|
}
|
|
|
|
|
else if(localsettings.opmode==1)
|
|
|
|
|
{
|
|
|
|
|
chatunits = repack_story_history(input);
|
|
|
|
|
}
|
|
|
|
|
else
|
|
|
|
|
{
|
|
|
|
|
chatunits = repack_instruct_history(input);
|
|
|
|
@ -18815,7 +19119,7 @@ Current version indicated by LITEVER below.
|
|
|
|
|
{
|
|
|
|
|
namepart = curr.name;
|
|
|
|
|
}
|
|
|
|
|
else if(localsettings.inject_chatnames_instruct && localsettings.instruct_has_markdown)
|
|
|
|
|
else if(localsettings.opmode==4 && localsettings.inject_chatnames_instruct && localsettings.instruct_has_markdown)
|
|
|
|
|
{
|
|
|
|
|
let validprefixes = [];
|
|
|
|
|
if(curr.myturn)
|
|
|
|
@ -18886,13 +19190,19 @@ Current version indicated by LITEVER below.
|
|
|
|
|
(curr.myturn ? `` : `<button title="Retry Chunk" onclick="corpo_retry_chunk(${i})" class="corpo_hover_btn" type="button" style="background-image: var(--img_corpo_retry);"></button>`)
|
|
|
|
|
+ `</div>`);
|
|
|
|
|
|
|
|
|
|
newbodystr += `<div class="corpostyleitem">
|
|
|
|
|
<div><img ${(curr.myturn ? "" : `onclick="corpo_click_avatar()"`)} src="${(curr.myturn ? human_square : niko_square)}" class="corpoavatar"/></div>
|
|
|
|
|
newbodystr += `<div class="corpostyleitem">`;
|
|
|
|
|
|
|
|
|
|
if(localsettings.opmode==1)
|
|
|
|
|
{
|
|
|
|
|
newbodystr += `<div style="width:100%">`;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
newbodystr += `<div><img ${(curr.myturn ? "" : `onclick="corpo_click_avatar()"`)} src="${(curr.myturn ? human_square : niko_square)}" class="corpoavatar"/></div>
|
|
|
|
|
<div style="width:100%">
|
|
|
|
|
<div class="corpostyleitemheading">`+ namepart + `</div>
|
|
|
|
|
`+ bodypart + chunkbtns + `
|
|
|
|
|
</div>
|
|
|
|
|
</div>`;
|
|
|
|
|
<div class="corpostyleitemheading">`+ namepart + `</div>`;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
newbodystr += bodypart + chunkbtns + `</div></div>`;
|
|
|
|
|
}
|
|
|
|
|
if(incomplete_resp)
|
|
|
|
|
{
|
|
|
|
@ -18902,14 +19212,23 @@ Current version indicated by LITEVER below.
|
|
|
|
|
{
|
|
|
|
|
namepart = "";
|
|
|
|
|
}
|
|
|
|
|
newbodystr += `<div class="corpostyleitem">
|
|
|
|
|
<div><img src="`+niko_square+`" class="corpoavatar"/></div>
|
|
|
|
|
newbodystr += `<div class="corpostyleitem">`;
|
|
|
|
|
|
|
|
|
|
if (localsettings.opmode == 1) {
|
|
|
|
|
newbodystr += `
|
|
|
|
|
<div>
|
|
|
|
|
<div class="corpostyleitemheading">`+namepart+`</div>
|
|
|
|
|
<div class="corpostyleitemcontent"><p><span class="pending_text">`+ futuretext +`</span></p></div>
|
|
|
|
|
</div>
|
|
|
|
|
<div class="corpostyleitemcontent"><p><span class="pending_text">`+ futuretext + `</span></p></div>
|
|
|
|
|
</div>`;
|
|
|
|
|
}
|
|
|
|
|
else {
|
|
|
|
|
newbodystr += `<div><img src="` + niko_square + `" class="corpoavatar"/></div>
|
|
|
|
|
<div>
|
|
|
|
|
<div class="corpostyleitemheading">`+ namepart +`</div>
|
|
|
|
|
<div class="corpostyleitemcontent"><p><span class="pending_text">`+ futuretext +`</span></p></div>
|
|
|
|
|
</div>`;
|
|
|
|
|
}
|
|
|
|
|
newbodystr += `</div>`;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return newbodystr;
|
|
|
|
|
}
|
|
|
|
@ -18932,6 +19251,24 @@ Current version indicated by LITEVER below.
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
function populate_corpo_leftpanel_topper()
|
|
|
|
|
{
|
|
|
|
|
let panel = document.getElementById('corpoleftpanelitemstopper');
|
|
|
|
|
let panelitems = `<div onclick="btn_memory()" class="corpo_leftpanel_btn" type="button" style="background-image: var(--img_gear); padding-left: 44px;">Context</div>
|
|
|
|
|
<div onclick="btn_editmode()" class="corpo_leftpanel_btn" type="button" style="background-image: var(--img_corpo_edit); padding-left: 44px;">Raw Editor</div>
|
|
|
|
|
<div onclick="update_toggle_lightmode(true)" class="corpo_leftpanel_btn" type="button" style="background-image: var(--img_corpo_theme); padding-left: 44px;">Light / Dark Theme</div>`;
|
|
|
|
|
|
|
|
|
|
if(localsettings.opmode==3||localsettings.opmode==4)
|
|
|
|
|
{
|
|
|
|
|
panelitems += `<div onclick="show_groupchat_select()" class="corpo_leftpanel_btn" type="button" style="background-image: var(--img_chat_mono); padding-left: 44px;">Chat Select</div>`;
|
|
|
|
|
}
|
|
|
|
|
else if(localsettings.opmode==2)
|
|
|
|
|
{
|
|
|
|
|
let amode = (localsettings.adventure_switch_mode==0?"Story Mode":(localsettings.adventure_switch_mode==1?"Action Mode":"Dice Mode"))
|
|
|
|
|
panelitems += `<div onclick="btn_adventure_mode()" class="corpo_leftpanel_btn" type="button" >Adventure: ${amode}</div>`;
|
|
|
|
|
}
|
|
|
|
|
panel.innerHTML = panelitems;
|
|
|
|
|
}
|
|
|
|
|
function populate_corpo_leftpanel()
|
|
|
|
|
{
|
|
|
|
|
let slotpromises = [];
|
|
|
|
@ -18941,22 +19278,16 @@ Current version indicated by LITEVER below.
|
|
|
|
|
}
|
|
|
|
|
Promise.all(slotpromises).then(slotlabels=>
|
|
|
|
|
{
|
|
|
|
|
let panel = document.getElementById('corpoleftpanelitems');
|
|
|
|
|
let panelitems = `
|
|
|
|
|
<div onclick="btn_memory()" class="corpo_leftpanel_btn" type="button" style="background-image: var(--img_gear); padding-left: 44px;">Context</div>
|
|
|
|
|
<div onclick="btn_editmode()" class="corpo_leftpanel_btn" type="button" style="background-image: var(--img_corpo_edit); padding-left: 44px;">Raw Editor</div>
|
|
|
|
|
<div onclick="update_toggle_lightmode(true)" class="corpo_leftpanel_btn" type="button" style="background-image: var(--img_corpo_theme); padding-left: 44px;">Light / Dark Theme</div>
|
|
|
|
|
<div style="padding:2px;font-size:14px;margin-left:8px;font-weight:600;line-height:1.1;margin-top:22px">Quick Slot Load</div>
|
|
|
|
|
<hr style="margin-top:4px;margin-bottom:6px" />
|
|
|
|
|
`;
|
|
|
|
|
|
|
|
|
|
let panel = document.getElementById('corpoleftpanelitemsinner');
|
|
|
|
|
let panelitems = ``;
|
|
|
|
|
populate_corpo_leftpanel_topper();
|
|
|
|
|
for(let i=0;i<slotlabels.length;++i)
|
|
|
|
|
{
|
|
|
|
|
let testslot = slotlabels[i];
|
|
|
|
|
let entry = "";
|
|
|
|
|
if(testslot)
|
|
|
|
|
{
|
|
|
|
|
entry = `<div onclick="load_from_slot(`+i+`, true)" class="corpo_leftpanel_btn" type="button">`+testslot+`</div>`;
|
|
|
|
|
entry = `<div onclick="load_from_slot(`+i+`, true, true)" class="corpo_leftpanel_btn" type="button">`+testslot+`</div>`;
|
|
|
|
|
}
|
|
|
|
|
panelitems += entry;
|
|
|
|
|
}
|
|
|
|
@ -21128,9 +21459,13 @@ Current version indicated by LITEVER below.
|
|
|
|
|
<div class="corpostyle">
|
|
|
|
|
<div id="corpo_leftpannel" class="corpoleftpanel">
|
|
|
|
|
<button title="Hide Corpo Side Panel" class="corpo_leftpanel_close mainnav" onclick="show_corpo_leftpanel(false)">×</button>
|
|
|
|
|
<p id="corpoleftpanelitems" class="corpoleftpanelitems">
|
|
|
|
|
|
|
|
|
|
</p>
|
|
|
|
|
<div id="corpoleftpanelitems" class="corpoleftpanelitems">
|
|
|
|
|
<div class="corpoleftpanelitemstopper" id="corpoleftpanelitemstopper"></div>
|
|
|
|
|
<div style="padding:2px;font-size:14px;margin-left:8px;font-weight:600;line-height:1.1;margin-top:12px">Quick Slot Load</div>
|
|
|
|
|
<hr style="margin-top:4px;margin-bottom:6px" />
|
|
|
|
|
<div class="corpoleftpanelitemsinner" id="corpoleftpanelitemsinner"></div>
|
|
|
|
|
<div style="margin-top: auto; margin-bottom:2px; width: 230px;"><div onclick="quicksave()" class="corpo_leftpanel_btn" type="button" style="width:110px;padding-left: 44px;display:inline-block;background-image: var(--img_save_mono);">Save</div><div onclick="quickdelete()" class="corpo_leftpanel_btn red" type="button" style="width:110px;padding-left: 44px;display:inline-block;background-image: var(--img_delete);">Delete</div></div>
|
|
|
|
|
</div>
|
|
|
|
|
</div>
|
|
|
|
|
<button title="Show Corpo Side Panel" class="corpo_leftpanel_open mainnav" onclick="show_corpo_leftpanel(true)"><div class="corpo_arrow_right"></div></button>
|
|
|
|
|
<div class="corporightpanel">
|
|
|
|
|