diff --git a/.gitignore b/.gitignore index dfacdbb2c958b4a10bb6a18b65a735c72f851fb2..a8e5e95aaf38882c899baf4745d843619fbed5fe 100644 --- a/.gitignore +++ b/.gitignore @@ -48,6 +48,9 @@ yarn.lock # WebStorm .idea +# Gulp +build/ + # backup *.bak *.gho diff --git a/Makefile b/Makefile index e1bee417127f5b00a480ce5923ec21aa3d9b6423..45577632899afb6f539f1a14520626fcd896429a 100644 --- a/Makefile +++ b/Makefile @@ -36,9 +36,13 @@ bin/%.html: bin/tmp bin/fc.js: bin/ devTools/concatFiles.sh js/ '*.js' $@ -bin/tmp: bin/fc.js injectGitCommitHash - $(TWEEGO) --module=bin/fc.js --head devTools/head.html src/ > $@ +bin/fc.css: bin/ + devTools/concatFiles.sh css/ '*.css' $@ + +bin/tmp: bin/fc.js bin/fc.css injectGitCommitHash + $(TWEEGO) --module=bin/fc.js --module=bin/fc.css --head resources/raster/favicon/arcologyVector.html src/ > $@ rm -f bin/fc.js + rm -f bin/fc.css injectGitCommitHash: printf "App.Version.commitHash = '%s';\n" $(COMMIT) > src/002-config/fc-version.js.commitHash.js diff --git a/build.config.json b/build.config.json index 53df91f839f39eaa1e6a83b4fc521639ec8f7d10..29c318251814ba9a463de44b1909ddf65c75d40a 100644 --- a/build.config.json +++ b/build.config.json @@ -8,7 +8,8 @@ "gitVersionFile": "src/002-config/fc-version.js.commitHash.js", "sources": { "module": { - "js": ["js/**/*.js"] + "js": ["js/**/*.js"], + "css": ["css/**/*.css"] }, "story": { "css": ["src/**/*.css"], @@ -19,7 +20,7 @@ "src/art/vector_revamp/layers" ] }, - "head": "devTools/head.html" + "head": "resources/raster/favicon/arcologyVector.html" }, "options": { "css": { diff --git a/compile.bat b/compile.bat index ac1bb770ee1a70e6a490379eecd9b98d1b7111da..ec8bda25248803f824719dd59c073a36896d52d6 100644 --- a/compile.bat +++ b/compile.bat @@ -28,13 +28,15 @@ if %GITFOUND% == yes ( if not exist "bin\resources" mkdir bin\resources CALL devTools/concatFiles.bat js\ "*.js" bin\fc.js +CALL devTools/concatFiles.bat css\ "*.css" bin\fc.css :: Run the appropriate compiler for the user's CPU architecture. if %PROCESSOR_ARCHITECTURE% == AMD64 ( - CALL "%~dp0devTools\tweeGo\tweego_win64.exe" -o "%~dp0bin/FC_pregmod.html" --module=bin/fc.js --head devTools/head.html "%~dp0src" + CALL "%~dp0devTools\tweeGo\tweego_win64.exe" -o "%~dp0bin/FC_pregmod.html" --module=bin/fc.js --module=bin/fc.css --head resources/raster/favicon/arcologyVector.html "%~dp0src" ) else ( - CALL "%~dp0devTools\tweeGo\tweego_win86.exe" -o "%~dp0bin/FC_pregmod.html" --module=bin/fc.js --head devTools/head.html "%~dp0src" + CALL "%~dp0devTools\tweeGo\tweego_win86.exe" -o "%~dp0bin/FC_pregmod.html" --module=bin/fc.js --module=bin/fc.css --head resources/raster/favicon/arcologyVector.html "%~dp0src" ) DEL bin\fc.js +DEL bin\fc.css IF EXIST "%~dp0src\002-config\fc-version.js.commitHash.js" DEL "%~dp0src\002-config\fc-version.js.commitHash.js" popd diff --git a/compile.sh b/compile.sh index c77dc55742827eba6e208a4265ef3df92518c8fc..5c6ab810026d650dd61a1a97ce65c845ab272dfd 100755 --- a/compile.sh +++ b/compile.sh @@ -75,8 +75,10 @@ function compile() { fi devTools/concatFiles.sh js/ '*.js' bin/fc.js - $TWEEGO_EXE -o $file --module=bin/fc.js --head devTools/head.html src/ || build_failed="true" + devTools/concatFiles.sh css/ '*.css' bin/fc.css + $TWEEGO_EXE -o $file --module=bin/fc.js --module=bin/fc.css --head resources/raster/favicon/arcologyVector.html src/ || build_failed="true" rm -f bin/fc.js + rm -f bin/fc.css if [ "$build_failed" = "true" ]; then echoError "Build failed." exit 1 diff --git a/src/001-lib/Jquery/CSS.tw b/css/001-lib/Jquery.css similarity index 99% rename from src/001-lib/Jquery/CSS.tw rename to css/001-lib/Jquery.css index 47b288174bb6cd331925d8c5804890485fda83c7..5345c366310a8f252eb1fa4fb0988b62d51f1419 100644 --- a/src/001-lib/Jquery/CSS.tw +++ b/css/001-lib/Jquery.css @@ -1,8 +1,7 @@ -:: JQuery UI stylesheet [stylesheet] /*! jQuery UI - v1.12.1 - 2017-05-29 * http://jqueryui.com * Includes: draggable.css, core.css, resizable.css, selectable.css, sortable.css, accordion.css, autocomplete.css, menu.css, button.css, controlgroup.css, checkboxradio.css, datepicker.css, dialog.css, progressbar.css, selectmenu.css, slider.css, spinner.css, tabs.css, tooltip.css, theme.css * To view and modify this theme, visit http://jqueryui.com/themeroller/?scope=&folderName=ui-darkness&cornerRadiusShadow=8px&offsetLeftShadow=-7px&offsetTopShadow=-7px&thicknessShadow=7px&opacityShadow=60&bgImgOpacityShadow=30&bgTextureShadow=flat&bgColorShadow=cccccc&opacityOverlay=80&bgImgOpacityOverlay=50&bgTextureOverlay=flat&bgColorOverlay=5c5c5c&iconColorError=a83300&fcError=111111&borderColorError=ffb73d&bgImgOpacityError=40&bgTextureError=glass&bgColorError=ffc73d&iconColorHighlight=4b8e0b&fcHighlight=2e7db2&borderColorHighlight=cccccc&bgImgOpacityHighlight=80&bgTextureHighlight=highlight_soft&bgColorHighlight=eeeeee&iconColorActive=222222&fcActive=ffffff&borderColorActive=ffaf0f&bgImgOpacityActive=30&bgTextureActive=inset_soft&bgColorActive=f58400&iconColorHover=ffffff&fcHover=ffffff&borderColorHover=59b4d4&bgImgOpacityHover=40&bgTextureHover=glass&bgColorHover=0078a3&iconColorDefault=cccccc&fcDefault=eeeeee&borderColorDefault=666666&bgImgOpacityDefault=20&bgTextureDefault=glass&bgColorDefault=555555&iconColorContent=cccccc&fcContent=ffffff&borderColorContent=666666&bgImgOpacityContent=25&bgTextureContent=inset_soft&bgColorContent=000000&iconColorHeader=ffffff&fcHeader=ffffff&borderColorHeader=333333&bgImgOpacityHeader=25&bgTextureHeader=gloss_wave&bgColorHeader=333333&cornerRadius=6px&fsDefault=1.1em&fwDefault=bold&ffDefault=Segoe%20UI%2CArial%2Csans-serif * Copyright jQuery Foundation and other contributors; Licensed MIT */ -.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,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");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Segoe UI,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Segoe UI,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #666}.ui-widget-content{border:1px solid #666;background:#000 url("images/ui-bg_inset-soft_25_000000_1x100.png") 50% bottom repeat-x;color:#fff}.ui-widget-content a{color:#fff}.ui-widget-header{border:1px solid #333;background:#333 url("images/ui-bg_gloss-wave_25_333333_500x100.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #666;background:#555 url("images/ui-bg_glass_20_555555_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#eee}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#eee;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #59b4d4;background:#0078a3 url("images/ui-bg_glass_40_0078a3_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#fff}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#fff;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #ffaf0f;background:#f58400 url("images/ui-bg_inset-soft_30_f58400_1x100.png") 50% 50% repeat-x;font-weight:bold;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#ffaf0f;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #ccc;background:#eee url("images/ui-bg_highlight-soft_80_eeeeee_1x100.png") 50% top repeat-x;color:#2e7db2}.ui-state-checked{border:1px solid #ccc;background:#eee}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#2e7db2}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #ffb73d;background:#ffc73d url("images/ui-bg_glass_40_ffc73d_1x400.png") 50% 50% repeat-x;color:#111}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#111}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#111}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_cccccc_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_4b8e0b_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_a83300_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_cccccc_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:6px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:6px}.ui-widget-overlay{background:#5c5c5c;opacity:.8;filter:Alpha(Opacity=80)}.ui-widget-shadow{-webkit-box-shadow:-7px -7px 7px #ccc;box-shadow:-7px -7px 7px #ccc} \ No newline at end of file +.ui-draggable-handle{-ms-touch-action:none;touch-action:none}.ui-helper-hidden{display:none}.ui-helper-hidden-accessible{border:0;clip:rect(0 0 0 0);height:1px;margin:-1px;overflow:hidden;padding:0;position:absolute;width:1px}.ui-helper-reset{margin:0;padding:0;border:0;outline:0;line-height:1.3;text-decoration:none;font-size:100%;list-style:none}.ui-helper-clearfix:before,.ui-helper-clearfix:after{content:"";display:table;border-collapse:collapse}.ui-helper-clearfix:after{clear:both}.ui-helper-zfix{width:100%;height:100%;top:0;left:0;position:absolute;opacity:0;filter:Alpha(Opacity=0)}.ui-front{z-index:100}.ui-state-disabled{cursor:default!important;pointer-events:none}.ui-icon{display:inline-block;vertical-align:middle;margin-top:-.25em;position:relative;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat}.ui-widget-icon-block{left:50%;margin-left:-8px;display:block}.ui-widget-overlay{position:fixed;top:0;left:0;width:100%;height:100%}.ui-resizable{position:relative}.ui-resizable-handle{position:absolute;font-size:0.1px;display:block;-ms-touch-action:none;touch-action:none}.ui-resizable-disabled .ui-resizable-handle,.ui-resizable-autohide .ui-resizable-handle{display:none}.ui-resizable-n{cursor:n-resize;height:7px;width:100%;top:-5px;left:0}.ui-resizable-s{cursor:s-resize;height:7px;width:100%;bottom:-5px;left:0}.ui-resizable-e{cursor:e-resize;width:7px;right:-5px;top:0;height:100%}.ui-resizable-w{cursor:w-resize;width:7px;left:-5px;top:0;height:100%}.ui-resizable-se{cursor:se-resize;width:12px;height:12px;right:1px;bottom:1px}.ui-resizable-sw{cursor:sw-resize;width:9px;height:9px;left:-5px;bottom:-5px}.ui-resizable-nw{cursor:nw-resize;width:9px;height:9px;left:-5px;top:-5px}.ui-resizable-ne{cursor:ne-resize;width:9px;height:9px;right:-5px;top:-5px}.ui-selectable{-ms-touch-action:none;touch-action:none}.ui-selectable-helper{position:absolute;z-index:100;border:1px dotted black}.ui-sortable-handle{-ms-touch-action:none;touch-action:none}.ui-accordion .ui-accordion-header{display:block;cursor:pointer;position:relative;margin:2px 0 0 0;padding:.5em .5em .5em .7em;font-size:100%}.ui-accordion .ui-accordion-content{padding:1em 2.2em;border-top:0;overflow:auto}.ui-autocomplete{position:absolute;top:0;left:0;cursor:default}.ui-menu{list-style:none;padding:0;margin:0;display:block;outline:0}.ui-menu .ui-menu{position:absolute}.ui-menu .ui-menu-item{margin:0;cursor:pointer;list-style-image:url("data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7")}.ui-menu .ui-menu-item-wrapper{position:relative;padding:3px 1em 3px .4em}.ui-menu .ui-menu-divider{margin:5px 0;height:0;font-size:0;line-height:0;border-width:1px 0 0 0}.ui-menu .ui-state-focus,.ui-menu .ui-state-active{margin:-1px}.ui-menu-icons{position:relative}.ui-menu-icons .ui-menu-item-wrapper{padding-left:2em}.ui-menu .ui-icon{position:absolute;top:0;bottom:0;left:.2em;margin:auto 0}.ui-menu .ui-menu-icon{left:auto;right:0}.ui-button{padding:.4em 1em;display:inline-block;position:relative;line-height:normal;margin-right:.1em;cursor:pointer;vertical-align:middle;text-align:center;-webkit-user-select:none;-moz-user-select:none;-ms-user-select:none;user-select:none;overflow:visible}.ui-button,.ui-button:link,.ui-button:visited,.ui-button:hover,.ui-button:active{text-decoration:none}.ui-button-icon-only{width:2em;box-sizing:border-box;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-button-icon-only{text-indent:0}.ui-button-icon-only .ui-icon{position:absolute;top:50%;left:50%;margin-top:-8px;margin-left:-8px}.ui-button.ui-icon-notext .ui-icon{padding:0;width:2.1em;height:2.1em;text-indent:-9999px;white-space:nowrap}input.ui-button.ui-icon-notext .ui-icon{width:auto;height:auto;text-indent:0;white-space:normal;padding:.4em 1em}input.ui-button::-moz-focus-inner,button.ui-button::-moz-focus-inner{border:0;padding:0}.ui-controlgroup{vertical-align:middle;display:inline-block}.ui-controlgroup > .ui-controlgroup-item{float:left;margin-left:0;margin-right:0}.ui-controlgroup > .ui-controlgroup-item:focus,.ui-controlgroup > .ui-controlgroup-item.ui-visual-focus{z-index:9999}.ui-controlgroup-vertical > .ui-controlgroup-item{display:block;float:none;width:100%;margin-top:0;margin-bottom:0;text-align:left}.ui-controlgroup-vertical .ui-controlgroup-item{box-sizing:border-box}.ui-controlgroup .ui-controlgroup-label{padding:.4em 1em}.ui-controlgroup .ui-controlgroup-label span{font-size:80%}.ui-controlgroup-horizontal .ui-controlgroup-label + .ui-controlgroup-item{border-left:none}.ui-controlgroup-vertical .ui-controlgroup-label + .ui-controlgroup-item{border-top:none}.ui-controlgroup-horizontal .ui-controlgroup-label.ui-widget-content{border-right:none}.ui-controlgroup-vertical .ui-controlgroup-label.ui-widget-content{border-bottom:none}.ui-controlgroup-vertical .ui-spinner-input{width:75%;width:calc( 100% - 2.4em )}.ui-controlgroup-vertical .ui-spinner .ui-spinner-up{border-top-style:solid}.ui-checkboxradio-label .ui-icon-background{box-shadow:inset 1px 1px 1px #ccc;border-radius:.12em;border:none}.ui-checkboxradio-radio-label .ui-icon-background{width:16px;height:16px;border-radius:1em;overflow:visible;border:none}.ui-checkboxradio-radio-label.ui-checkboxradio-checked .ui-icon,.ui-checkboxradio-radio-label.ui-checkboxradio-checked:hover .ui-icon{background-image:none;width:8px;height:8px;border-width:4px;border-style:solid}.ui-checkboxradio-disabled{pointer-events:none}.ui-datepicker{width:17em;padding:.2em .2em 0;display:none}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:2px;width:1.8em;height:1.8em}.ui-datepicker .ui-datepicker-prev-hover,.ui-datepicker .ui-datepicker-next-hover{top:1px}.ui-datepicker .ui-datepicker-prev{left:2px}.ui-datepicker .ui-datepicker-next{right:2px}.ui-datepicker .ui-datepicker-prev-hover{left:1px}.ui-datepicker .ui-datepicker-next-hover{right:1px}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:block;position:absolute;left:50%;margin-left:-8px;top:50%;margin-top:-8px}.ui-datepicker .ui-datepicker-title{margin:0 2.3em;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{font-size:1em;margin:1px 0}.ui-datepicker select.ui-datepicker-month,.ui-datepicker select.ui-datepicker-year{width:45%}.ui-datepicker table{width:100%;font-size:.9em;border-collapse:collapse;margin:0 0 .4em}.ui-datepicker th{padding:.7em .3em;text-align:center;font-weight:bold;border:0}.ui-datepicker td{border:0;padding:1px}.ui-datepicker td span,.ui-datepicker td a{display:block;padding:.2em;text-align:right;text-decoration:none}.ui-datepicker .ui-datepicker-buttonpane{background-image:none;margin:.7em 0 0 0;padding:0 .2em;border-left:0;border-right:0;border-bottom:0}.ui-datepicker .ui-datepicker-buttonpane button{float:right;margin:.5em .2em .4em;cursor:pointer;padding:.2em .6em .3em .6em;width:auto;overflow:visible}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:left}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-header{border-left-width:0}.ui-datepicker-multi .ui-datepicker-buttonpane{clear:left}.ui-datepicker-row-break{clear:both;width:100%;font-size:0}.ui-datepicker-rtl{direction:rtl}.ui-datepicker-rtl .ui-datepicker-prev{right:2px;left:auto}.ui-datepicker-rtl .ui-datepicker-next{left:2px;right:auto}.ui-datepicker-rtl .ui-datepicker-prev:hover{right:1px;left:auto}.ui-datepicker-rtl .ui-datepicker-next:hover{left:1px;right:auto}.ui-datepicker-rtl .ui-datepicker-buttonpane{clear:right}.ui-datepicker-rtl .ui-datepicker-buttonpane button{float:left}.ui-datepicker-rtl .ui-datepicker-buttonpane button.ui-datepicker-current,.ui-datepicker-rtl .ui-datepicker-group{float:right}.ui-datepicker-rtl .ui-datepicker-group-last .ui-datepicker-header,.ui-datepicker-rtl .ui-datepicker-group-middle .ui-datepicker-header{border-right-width:0;border-left-width:1px}.ui-datepicker .ui-icon{display:block;text-indent:-99999px;overflow:hidden;background-repeat:no-repeat;left:.5em;top:.3em}.ui-dialog{position:absolute;top:0;left:0;padding:.2em;outline:0}.ui-dialog .ui-dialog-titlebar{padding:.4em 1em;position:relative}.ui-dialog .ui-dialog-title{float:left;margin:.1em 0;white-space:nowrap;width:90%;overflow:hidden;text-overflow:ellipsis}.ui-dialog .ui-dialog-titlebar-close{position:absolute;right:.3em;top:50%;width:20px;margin:-10px 0 0 0;padding:1px;height:20px}.ui-dialog .ui-dialog-content{position:relative;border:0;padding:.5em 1em;background:none;overflow:auto}.ui-dialog .ui-dialog-buttonpane{text-align:left;border-width:1px 0 0 0;background-image:none;margin-top:.5em;padding:.3em 1em .5em .4em}.ui-dialog .ui-dialog-buttonpane .ui-dialog-buttonset{float:right}.ui-dialog .ui-dialog-buttonpane button{margin:.5em .4em .5em 0;cursor:pointer}.ui-dialog .ui-resizable-n{height:2px;top:0}.ui-dialog .ui-resizable-e{width:2px;right:0}.ui-dialog .ui-resizable-s{height:2px;bottom:0}.ui-dialog .ui-resizable-w{width:2px;left:0}.ui-dialog .ui-resizable-se,.ui-dialog .ui-resizable-sw,.ui-dialog .ui-resizable-ne,.ui-dialog .ui-resizable-nw{width:7px;height:7px}.ui-dialog .ui-resizable-se{right:0;bottom:0}.ui-dialog .ui-resizable-sw{left:0;bottom:0}.ui-dialog .ui-resizable-ne{right:0;top:0}.ui-dialog .ui-resizable-nw{left:0;top:0}.ui-draggable .ui-dialog-titlebar{cursor:move}.ui-progressbar{height:2em;text-align:left;overflow:hidden}.ui-progressbar .ui-progressbar-value{margin:-1px;height:100%}.ui-progressbar .ui-progressbar-overlay{background:url("data:image/gif;base64,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");height:100%;filter:alpha(opacity=25);opacity:0.25}.ui-progressbar-indeterminate .ui-progressbar-value{background-image:none}.ui-selectmenu-menu{padding:0;margin:0;position:absolute;top:0;left:0;display:none}.ui-selectmenu-menu .ui-menu{overflow:auto;overflow-x:hidden;padding-bottom:1px}.ui-selectmenu-menu .ui-menu .ui-selectmenu-optgroup{font-size:1em;font-weight:bold;line-height:1.5;padding:2px 0.4em;margin:0.5em 0 0 0;height:auto;border:0}.ui-selectmenu-open{display:block}.ui-selectmenu-text{display:block;margin-right:20px;overflow:hidden;text-overflow:ellipsis}.ui-selectmenu-button.ui-button{text-align:left;white-space:nowrap;width:14em}.ui-selectmenu-icon.ui-icon{float:right;margin-top:0}.ui-slider{position:relative;text-align:left}.ui-slider .ui-slider-handle{position:absolute;z-index:2;width:1.2em;height:1.2em;cursor:default;-ms-touch-action:none;touch-action:none}.ui-slider .ui-slider-range{position:absolute;z-index:1;font-size:.7em;display:block;border:0;background-position:0 0}.ui-slider.ui-state-disabled .ui-slider-handle,.ui-slider.ui-state-disabled .ui-slider-range{filter:inherit}.ui-slider-horizontal{height:.8em}.ui-slider-horizontal .ui-slider-handle{top:-.3em;margin-left:-.6em}.ui-slider-horizontal .ui-slider-range{top:0;height:100%}.ui-slider-horizontal .ui-slider-range-min{left:0}.ui-slider-horizontal .ui-slider-range-max{right:0}.ui-slider-vertical{width:.8em;height:100px}.ui-slider-vertical .ui-slider-handle{left:-.3em;margin-left:0;margin-bottom:-.6em}.ui-slider-vertical .ui-slider-range{left:0;width:100%}.ui-slider-vertical .ui-slider-range-min{bottom:0}.ui-slider-vertical .ui-slider-range-max{top:0}.ui-spinner{position:relative;display:inline-block;overflow:hidden;padding:0;vertical-align:middle}.ui-spinner-input{border:none;background:none;color:inherit;padding:.222em 0;margin:.2em 0;vertical-align:middle;margin-left:.4em;margin-right:2em}.ui-spinner-button{width:1.6em;height:50%;font-size:.5em;padding:0;margin:0;text-align:center;position:absolute;cursor:default;display:block;overflow:hidden;right:0}.ui-spinner a.ui-spinner-button{border-top-style:none;border-bottom-style:none;border-right-style:none}.ui-spinner-up{top:0}.ui-spinner-down{bottom:0}.ui-tabs{position:relative;padding:.2em}.ui-tabs .ui-tabs-nav{margin:0;padding:.2em .2em 0}.ui-tabs .ui-tabs-nav li{list-style:none;float:left;position:relative;top:0;margin:1px .2em 0 0;border-bottom-width:0;padding:0;white-space:nowrap}.ui-tabs .ui-tabs-nav .ui-tabs-anchor{float:left;padding:.5em 1em;text-decoration:none}.ui-tabs .ui-tabs-nav li.ui-tabs-active{margin-bottom:-1px;padding-bottom:1px}.ui-tabs .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-state-disabled .ui-tabs-anchor,.ui-tabs .ui-tabs-nav li.ui-tabs-loading .ui-tabs-anchor{cursor:text}.ui-tabs-collapsible .ui-tabs-nav li.ui-tabs-active .ui-tabs-anchor{cursor:pointer}.ui-tabs .ui-tabs-panel{display:block;border-width:0;padding:1em 1.4em;background:none}.ui-tooltip{padding:8px;position:absolute;z-index:9999;max-width:300px}body .ui-tooltip{border-width:2px}.ui-widget{font-family:Segoe UI,Arial,sans-serif;font-size:1.1em}.ui-widget .ui-widget{font-size:1em}.ui-widget input,.ui-widget select,.ui-widget textarea,.ui-widget button{font-family:Segoe UI,Arial,sans-serif;font-size:1em}.ui-widget.ui-widget-content{border:1px solid #666}.ui-widget-content{border:1px solid #666;background:#000 url("images/ui-bg_inset-soft_25_000000_1x100.png") 50% bottom repeat-x;color:#fff}.ui-widget-content a{color:#fff}.ui-widget-header{border:1px solid #333;background:#333 url("images/ui-bg_gloss-wave_25_333333_500x100.png") 50% 50% repeat-x;color:#fff;font-weight:bold}.ui-widget-header a{color:#fff}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default,.ui-button,html .ui-button.ui-state-disabled:hover,html .ui-button.ui-state-disabled:active{border:1px solid #666;background:#555 url("images/ui-bg_glass_20_555555_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#eee}.ui-state-default a,.ui-state-default a:link,.ui-state-default a:visited,a.ui-button,a:link.ui-button,a:visited.ui-button,.ui-button{color:#eee;text-decoration:none}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus,.ui-button:hover,.ui-button:focus{border:1px solid #59b4d4;background:#0078a3 url("images/ui-bg_glass_40_0078a3_1x400.png") 50% 50% repeat-x;font-weight:bold;color:#fff}.ui-state-hover a,.ui-state-hover a:hover,.ui-state-hover a:link,.ui-state-hover a:visited,.ui-state-focus a,.ui-state-focus a:hover,.ui-state-focus a:link,.ui-state-focus a:visited,a.ui-button:hover,a.ui-button:focus{color:#fff;text-decoration:none}.ui-visual-focus{box-shadow:0 0 3px 1px rgb(94,158,214)}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active,a.ui-button:active,.ui-button:active,.ui-button.ui-state-active:hover{border:1px solid #ffaf0f;background:#f58400 url("images/ui-bg_inset-soft_30_f58400_1x100.png") 50% 50% repeat-x;font-weight:bold;color:#fff}.ui-icon-background,.ui-state-active .ui-icon-background{border:#ffaf0f;background-color:#fff}.ui-state-active a,.ui-state-active a:link,.ui-state-active a:visited{color:#fff;text-decoration:none}.ui-state-highlight,.ui-widget-content .ui-state-highlight,.ui-widget-header .ui-state-highlight{border:1px solid #ccc;background:#eee url("images/ui-bg_highlight-soft_80_eeeeee_1x100.png") 50% top repeat-x;color:#2e7db2}.ui-state-checked{border:1px solid #ccc;background:#eee}.ui-state-highlight a,.ui-widget-content .ui-state-highlight a,.ui-widget-header .ui-state-highlight a{color:#2e7db2}.ui-state-error,.ui-widget-content .ui-state-error,.ui-widget-header .ui-state-error{border:1px solid #ffb73d;background:#ffc73d url("images/ui-bg_glass_40_ffc73d_1x400.png") 50% 50% repeat-x;color:#111}.ui-state-error a,.ui-widget-content .ui-state-error a,.ui-widget-header .ui-state-error a{color:#111}.ui-state-error-text,.ui-widget-content .ui-state-error-text,.ui-widget-header .ui-state-error-text{color:#111}.ui-priority-primary,.ui-widget-content .ui-priority-primary,.ui-widget-header .ui-priority-primary{font-weight:bold}.ui-priority-secondary,.ui-widget-content .ui-priority-secondary,.ui-widget-header .ui-priority-secondary{opacity:.7;filter:Alpha(Opacity=70);font-weight:normal}.ui-state-disabled,.ui-widget-content .ui-state-disabled,.ui-widget-header .ui-state-disabled{opacity:.35;filter:Alpha(Opacity=35);background-image:none}.ui-state-disabled .ui-icon{filter:Alpha(Opacity=35)}.ui-icon{width:16px;height:16px}.ui-icon,.ui-widget-content .ui-icon{background-image:url("images/ui-icons_cccccc_256x240.png")}.ui-widget-header .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-hover .ui-icon,.ui-state-focus .ui-icon,.ui-button:hover .ui-icon,.ui-button:focus .ui-icon{background-image:url("images/ui-icons_ffffff_256x240.png")}.ui-state-active .ui-icon,.ui-button:active .ui-icon{background-image:url("images/ui-icons_222222_256x240.png")}.ui-state-highlight .ui-icon,.ui-button .ui-state-highlight.ui-icon{background-image:url("images/ui-icons_4b8e0b_256x240.png")}.ui-state-error .ui-icon,.ui-state-error-text .ui-icon{background-image:url("images/ui-icons_a83300_256x240.png")}.ui-button .ui-icon{background-image:url("images/ui-icons_cccccc_256x240.png")}.ui-icon-blank{background-position:16px 16px}.ui-icon-caret-1-n{background-position:0 0}.ui-icon-caret-1-ne{background-position:-16px 0}.ui-icon-caret-1-e{background-position:-32px 0}.ui-icon-caret-1-se{background-position:-48px 0}.ui-icon-caret-1-s{background-position:-65px 0}.ui-icon-caret-1-sw{background-position:-80px 0}.ui-icon-caret-1-w{background-position:-96px 0}.ui-icon-caret-1-nw{background-position:-112px 0}.ui-icon-caret-2-n-s{background-position:-128px 0}.ui-icon-caret-2-e-w{background-position:-144px 0}.ui-icon-triangle-1-n{background-position:0 -16px}.ui-icon-triangle-1-ne{background-position:-16px -16px}.ui-icon-triangle-1-e{background-position:-32px -16px}.ui-icon-triangle-1-se{background-position:-48px -16px}.ui-icon-triangle-1-s{background-position:-65px -16px}.ui-icon-triangle-1-sw{background-position:-80px -16px}.ui-icon-triangle-1-w{background-position:-96px -16px}.ui-icon-triangle-1-nw{background-position:-112px -16px}.ui-icon-triangle-2-n-s{background-position:-128px -16px}.ui-icon-triangle-2-e-w{background-position:-144px -16px}.ui-icon-arrow-1-n{background-position:0 -32px}.ui-icon-arrow-1-ne{background-position:-16px -32px}.ui-icon-arrow-1-e{background-position:-32px -32px}.ui-icon-arrow-1-se{background-position:-48px -32px}.ui-icon-arrow-1-s{background-position:-65px -32px}.ui-icon-arrow-1-sw{background-position:-80px -32px}.ui-icon-arrow-1-w{background-position:-96px -32px}.ui-icon-arrow-1-nw{background-position:-112px -32px}.ui-icon-arrow-2-n-s{background-position:-128px -32px}.ui-icon-arrow-2-ne-sw{background-position:-144px -32px}.ui-icon-arrow-2-e-w{background-position:-160px -32px}.ui-icon-arrow-2-se-nw{background-position:-176px -32px}.ui-icon-arrowstop-1-n{background-position:-192px -32px}.ui-icon-arrowstop-1-e{background-position:-208px -32px}.ui-icon-arrowstop-1-s{background-position:-224px -32px}.ui-icon-arrowstop-1-w{background-position:-240px -32px}.ui-icon-arrowthick-1-n{background-position:1px -48px}.ui-icon-arrowthick-1-ne{background-position:-16px -48px}.ui-icon-arrowthick-1-e{background-position:-32px -48px}.ui-icon-arrowthick-1-se{background-position:-48px -48px}.ui-icon-arrowthick-1-s{background-position:-64px -48px}.ui-icon-arrowthick-1-sw{background-position:-80px -48px}.ui-icon-arrowthick-1-w{background-position:-96px -48px}.ui-icon-arrowthick-1-nw{background-position:-112px -48px}.ui-icon-arrowthick-2-n-s{background-position:-128px -48px}.ui-icon-arrowthick-2-ne-sw{background-position:-144px -48px}.ui-icon-arrowthick-2-e-w{background-position:-160px -48px}.ui-icon-arrowthick-2-se-nw{background-position:-176px -48px}.ui-icon-arrowthickstop-1-n{background-position:-192px -48px}.ui-icon-arrowthickstop-1-e{background-position:-208px -48px}.ui-icon-arrowthickstop-1-s{background-position:-224px -48px}.ui-icon-arrowthickstop-1-w{background-position:-240px -48px}.ui-icon-arrowreturnthick-1-w{background-position:0 -64px}.ui-icon-arrowreturnthick-1-n{background-position:-16px -64px}.ui-icon-arrowreturnthick-1-e{background-position:-32px -64px}.ui-icon-arrowreturnthick-1-s{background-position:-48px -64px}.ui-icon-arrowreturn-1-w{background-position:-64px -64px}.ui-icon-arrowreturn-1-n{background-position:-80px -64px}.ui-icon-arrowreturn-1-e{background-position:-96px -64px}.ui-icon-arrowreturn-1-s{background-position:-112px -64px}.ui-icon-arrowrefresh-1-w{background-position:-128px -64px}.ui-icon-arrowrefresh-1-n{background-position:-144px -64px}.ui-icon-arrowrefresh-1-e{background-position:-160px -64px}.ui-icon-arrowrefresh-1-s{background-position:-176px -64px}.ui-icon-arrow-4{background-position:0 -80px}.ui-icon-arrow-4-diag{background-position:-16px -80px}.ui-icon-extlink{background-position:-32px -80px}.ui-icon-newwin{background-position:-48px -80px}.ui-icon-refresh{background-position:-64px -80px}.ui-icon-shuffle{background-position:-80px -80px}.ui-icon-transfer-e-w{background-position:-96px -80px}.ui-icon-transferthick-e-w{background-position:-112px -80px}.ui-icon-folder-collapsed{background-position:0 -96px}.ui-icon-folder-open{background-position:-16px -96px}.ui-icon-document{background-position:-32px -96px}.ui-icon-document-b{background-position:-48px -96px}.ui-icon-note{background-position:-64px -96px}.ui-icon-mail-closed{background-position:-80px -96px}.ui-icon-mail-open{background-position:-96px -96px}.ui-icon-suitcase{background-position:-112px -96px}.ui-icon-comment{background-position:-128px -96px}.ui-icon-person{background-position:-144px -96px}.ui-icon-print{background-position:-160px -96px}.ui-icon-trash{background-position:-176px -96px}.ui-icon-locked{background-position:-192px -96px}.ui-icon-unlocked{background-position:-208px -96px}.ui-icon-bookmark{background-position:-224px -96px}.ui-icon-tag{background-position:-240px -96px}.ui-icon-home{background-position:0 -112px}.ui-icon-flag{background-position:-16px -112px}.ui-icon-calendar{background-position:-32px -112px}.ui-icon-cart{background-position:-48px -112px}.ui-icon-pencil{background-position:-64px -112px}.ui-icon-clock{background-position:-80px -112px}.ui-icon-disk{background-position:-96px -112px}.ui-icon-calculator{background-position:-112px -112px}.ui-icon-zoomin{background-position:-128px -112px}.ui-icon-zoomout{background-position:-144px -112px}.ui-icon-search{background-position:-160px -112px}.ui-icon-wrench{background-position:-176px -112px}.ui-icon-gear{background-position:-192px -112px}.ui-icon-heart{background-position:-208px -112px}.ui-icon-star{background-position:-224px -112px}.ui-icon-link{background-position:-240px -112px}.ui-icon-cancel{background-position:0 -128px}.ui-icon-plus{background-position:-16px -128px}.ui-icon-plusthick{background-position:-32px -128px}.ui-icon-minus{background-position:-48px -128px}.ui-icon-minusthick{background-position:-64px -128px}.ui-icon-close{background-position:-80px -128px}.ui-icon-closethick{background-position:-96px -128px}.ui-icon-key{background-position:-112px -128px}.ui-icon-lightbulb{background-position:-128px -128px}.ui-icon-scissors{background-position:-144px -128px}.ui-icon-clipboard{background-position:-160px -128px}.ui-icon-copy{background-position:-176px -128px}.ui-icon-contact{background-position:-192px -128px}.ui-icon-image{background-position:-208px -128px}.ui-icon-video{background-position:-224px -128px}.ui-icon-script{background-position:-240px -128px}.ui-icon-alert{background-position:0 -144px}.ui-icon-info{background-position:-16px -144px}.ui-icon-notice{background-position:-32px -144px}.ui-icon-help{background-position:-48px -144px}.ui-icon-check{background-position:-64px -144px}.ui-icon-bullet{background-position:-80px -144px}.ui-icon-radio-on{background-position:-96px -144px}.ui-icon-radio-off{background-position:-112px -144px}.ui-icon-pin-w{background-position:-128px -144px}.ui-icon-pin-s{background-position:-144px -144px}.ui-icon-play{background-position:0 -160px}.ui-icon-pause{background-position:-16px -160px}.ui-icon-seek-next{background-position:-32px -160px}.ui-icon-seek-prev{background-position:-48px -160px}.ui-icon-seek-end{background-position:-64px -160px}.ui-icon-seek-start{background-position:-80px -160px}.ui-icon-seek-first{background-position:-80px -160px}.ui-icon-stop{background-position:-96px -160px}.ui-icon-eject{background-position:-112px -160px}.ui-icon-volume-off{background-position:-128px -160px}.ui-icon-volume-on{background-position:-144px -160px}.ui-icon-power{background-position:0 -176px}.ui-icon-signal-diag{background-position:-16px -176px}.ui-icon-signal{background-position:-32px -176px}.ui-icon-battery-0{background-position:-48px -176px}.ui-icon-battery-1{background-position:-64px -176px}.ui-icon-battery-2{background-position:-80px -176px}.ui-icon-battery-3{background-position:-96px -176px}.ui-icon-circle-plus{background-position:0 -192px}.ui-icon-circle-minus{background-position:-16px -192px}.ui-icon-circle-close{background-position:-32px -192px}.ui-icon-circle-triangle-e{background-position:-48px -192px}.ui-icon-circle-triangle-s{background-position:-64px -192px}.ui-icon-circle-triangle-w{background-position:-80px -192px}.ui-icon-circle-triangle-n{background-position:-96px -192px}.ui-icon-circle-arrow-e{background-position:-112px -192px}.ui-icon-circle-arrow-s{background-position:-128px -192px}.ui-icon-circle-arrow-w{background-position:-144px -192px}.ui-icon-circle-arrow-n{background-position:-160px -192px}.ui-icon-circle-zoomin{background-position:-176px -192px}.ui-icon-circle-zoomout{background-position:-192px -192px}.ui-icon-circle-check{background-position:-208px -192px}.ui-icon-circlesmall-plus{background-position:0 -208px}.ui-icon-circlesmall-minus{background-position:-16px -208px}.ui-icon-circlesmall-close{background-position:-32px -208px}.ui-icon-squaresmall-plus{background-position:-48px -208px}.ui-icon-squaresmall-minus{background-position:-64px -208px}.ui-icon-squaresmall-close{background-position:-80px -208px}.ui-icon-grip-dotted-vertical{background-position:0 -224px}.ui-icon-grip-dotted-horizontal{background-position:-16px -224px}.ui-icon-grip-solid-vertical{background-position:-32px -224px}.ui-icon-grip-solid-horizontal{background-position:-48px -224px}.ui-icon-gripsmall-diagonal-se{background-position:-64px -224px}.ui-icon-grip-diagonal-se{background-position:-80px -224px}.ui-corner-all,.ui-corner-top,.ui-corner-left,.ui-corner-tl{border-top-left-radius:6px}.ui-corner-all,.ui-corner-top,.ui-corner-right,.ui-corner-tr{border-top-right-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-left,.ui-corner-bl{border-bottom-left-radius:6px}.ui-corner-all,.ui-corner-bottom,.ui-corner-right,.ui-corner-br{border-bottom-right-radius:6px}.ui-widget-overlay{background:#5c5c5c;opacity:.8;filter:Alpha(Opacity=80)}.ui-widget-shadow{-webkit-box-shadow:-7px -7px 7px #ccc;box-shadow:-7px -7px 7px #ccc} diff --git a/css/001-lib/macros.css b/css/001-lib/macros.css new file mode 100644 index 0000000000000000000000000000000000000000..39a2dd5778ec12fd4f0bb7b9e179053e5fbf61a8 --- /dev/null +++ b/css/001-lib/macros.css @@ -0,0 +1,2 @@ +/*! <<checkvars>> macro for SugarCube 2.x */ +#ui-dialog-body.checkvars{padding:1em}#ui-dialog-body.checkvars h1{font-size:1em;margin-top:0}#ui-dialog-body.checkvars table{border-collapse:collapse;border-spacing:0}#ui-dialog-body.checkvars thead tr{border-bottom:2px solid #444}#ui-dialog-body.checkvars tr:not(:first-child){border-top:1px solid #444}#ui-dialog-body.checkvars td,#ui-dialog-body.checkvars th{padding:.25em 1em}#ui-dialog-body.checkvars td:first-child,#ui-dialog-body.checkvars th:first-child{padding-left:.5em;border-right:1px solid #444}#ui-dialog-body.checkvars td:last-child,#ui-dialog-body.checkvars th:last-child{padding-right:.5em}#ui-dialog-body.checkvars th:first-child{text-align:center}#ui-dialog-body.checkvars td:first-child{font-weight:700;text-align:right}#ui-dialog-body.checkvars td{font-family:monospace,monospace;vertical-align:top;white-space:pre-wrap}#ui-dialog-body.checkvars .scroll-pad{margin:0;padding:0} diff --git a/src/002-config/colors.css b/css/002-variables/colors.css similarity index 100% rename from src/002-config/colors.css rename to css/002-variables/colors.css diff --git a/css/003-sugarcube-overwrite/general.css b/css/003-sugarcube-overwrite/general.css new file mode 100644 index 0000000000000000000000000000000000000000..08a03244235a115489a0718a3cdbd419b39bbcec --- /dev/null +++ b/css/003-sugarcube-overwrite/general.css @@ -0,0 +1,24 @@ +body { + overflow-x: hidden; +} + +/* clears SugarCube's default transition */ +.passage { + transition: none; + -webkit-transition: none; +} + +.passage-in { + opacity: 1 !important; +} + +#passages { + /* max-width: 54em */ + max-width: 100%; +} + +/* makes HR colorflip compatible */ +hr { + background:#ccc; + border:0; +} diff --git a/src/002-config/modSC.css b/css/003-sugarcube-overwrite/sidebar.css similarity index 75% rename from src/002-config/modSC.css rename to css/003-sugarcube-overwrite/sidebar.css index b09893b63ac65cc1c62b2bedf44ecd1bf831cbfd..a43d1b8df06cb7da002cf9538860637ae89bf423 100644 --- a/src/002-config/modSC.css +++ b/css/003-sugarcube-overwrite/sidebar.css @@ -7,11 +7,19 @@ height: calc(100% - 1.5em); margin: 1.5em 0; } + #ui-bar-body > :not(:first-child) { /* margin-top: 2em; */ margin-top: 1.5em; } + #story-author { /* margin-top: 2em; */ margin-top: 0; } + +/* make cheat text boxes fit in sidebar */ +#story-caption input { + min-width: 0; + width: calc(100% - 0.8em - 2px); +} diff --git a/src/003-assets/CSS/arcologyBuilding.css b/css/arcologyBuilding/arcologyBuilding.css similarity index 100% rename from src/003-assets/CSS/arcologyBuilding.css rename to css/arcologyBuilding/arcologyBuilding.css diff --git a/css/art/art.css b/css/art/art.css new file mode 100644 index 0000000000000000000000000000000000000000..2610af5ed5c82ca8c8a1a98820ad24740e1022f0 --- /dev/null +++ b/css/art/art.css @@ -0,0 +1,112 @@ +/* small trick to hide broken images */ +img { + text-indent: -10000px; +} + +.imageColumn { /* TODO: this is mostly a copy of imageRef to get its flex features working properly. They can probably be removed from imageRef at some point */ + display: flex; + flex-direction: column; + flex-wrap: wrap; + align-items: flex-start; + position: relative; + float: right; +} + +.imageRef { + display: flex; + flex-direction: column; + flex-wrap: wrap; + align-items: flex-start; + position: relative; + background-color: rgba(80, 80, 80, 0.5); + margin: 2px; +} + +.tinyImg { + height: 120px; + width: 120px; + float: left; +} + +.smlImg { + height: 150px; + width: 150px; + float: left; +} + +.smlImg > img, .smlImg > video { + height: auto; +} + +.medImg { + height: 300px; + width: 300px; + float: right; +} + +.medImg > img, .medImg > video { + height: auto; +} + +.lrgRender { + height: 531px; + width: 531px; + margin-right: -50px; + margin-left: -50px; + float: right; + z-index: -1; +} + +.lrgVector { + height: 600px; + width: 600px; + margin-right: -125px; + margin-left: -125px; + float: right; + z-index: -1; +} + +.lrgRender > div.mask { + width: 150px; + height: 100%; + background: linear-gradient(90deg, rgba(17, 17, 17, 1), rgba(17, 17, 17, 0.8) 60%, rgba(17, 17, 17, 0)); + z-index: 1; + /*position: absolute;*/ +} + +.lrgRender > img, .lrgRender > video { + margin-left: -150px; + height: 531px; + width: auto; +} + +.lrgVector > div.mask { + width: 150px; + height: 100%; + background: linear-gradient(90deg, rgba(17, 17, 17, 1), rgba(17, 17, 17, 0.8) 60%, rgba(17, 17, 17, 0)); + z-index: 1; +} + +.lrgVector > img, .lrgVector > video { + margin-left: -150px; + height: 600px; + width: auto; +} + +.lrgVector svg { + width: 336px; +} + +object { + object-fit: scale-down; + position: absolute; + top: 0; + left: 0; +} + +img.paperdoll { + position: absolute; + top: 0; + left: 0; + margin-left: 0; +} diff --git a/css/corporation/corporation.css b/css/corporation/corporation.css new file mode 100644 index 0000000000000000000000000000000000000000..2c6e95350204026e0da50b0bc8b4294b3af35426 --- /dev/null +++ b/css/corporation/corporation.css @@ -0,0 +1,39 @@ +.founding { + font-size: 0.8em; + margin-top: -0.8em; + margin-left: 0.5em; + font-style: italic; +} + +table.corporate { + border: 3px darkgreen double; + border-collapse: collapse; + min-width: 33%; +} + +table.corporate tbody tr:nth-child(even) { + background-color: rgb(0, 30, 0); +} + +table.corporate tbody tr:nth-child(odd) { + background-color: rgb(15, 40, 15); +} + +table.corporate td { + vertical-align: top; +} + +table.corporate tbody th, table.corporate thead th { + background-color: black; + font-weight: bold; +} + +.minor-note { + font-size: 0.75em; + font-style: italic; +} + +.majorText { + margin-top: 0.5em; + margin-bottom: 1.5em; +} diff --git a/css/css.md b/css/css.md new file mode 100644 index 0000000000000000000000000000000000000000..f259684518eda9eb52a1895036d44904fbfcc39c --- /dev/null +++ b/css/css.md @@ -0,0 +1,22 @@ +# CSS module + +This directory contains ALL style files for this project. + +## Structure + +Most of the structure should be self-explanatory, this is a list of the main rules when adding new styles + +* `general/`: Only Styles that can be used in many different places and are not part of a specific system may be added + here. + +* When adding styles that are only used in one place put them in a directory that matches the top directory of the + corresponding JS file in `src/` or `js/`. + +* There is no catch-all file, if there is no place where your style goes create one instead of mixing them together with + unrelated styles. This does mean there are many small files, but properly sorted and named this is preferable to one + large catch-all file. + +## Compiling + +During compiling all CSS files in this directory get combined and then added as a module, which means the styles are put +directly into <head> element of the final HTML file. diff --git a/src/pregmod/FCTV/FCTV.css b/css/endWeek/FCTV.css similarity index 79% rename from src/pregmod/FCTV/FCTV.css rename to css/endWeek/FCTV.css index f7a3b69f149ad68fc4437c2355e9f3c0d18bc199..8d7bdd5ac3342703136f3e88971cefb6200354d5 100644 --- a/src/pregmod/FCTV/FCTV.css +++ b/css/endWeek/FCTV.css @@ -1,13 +1,14 @@ -.FCTV { +.fctv { display: float; } + .fctv-remote { text-align: center; justify-items: center; display: grid; - float:left; - width:min-content; - padding-right:20px; + float: left; + width: min-content; + padding-right: 20px; } .fctv-remote-numbers { display: grid; @@ -17,4 +18,4 @@ } .fctv-remote-button { margin-top: 10px; -} \ No newline at end of file +} diff --git a/src/003-assets/CSS/endWeekAnim.css b/css/endWeek/endWeekAnim.css similarity index 100% rename from src/003-assets/CSS/endWeekAnim.css rename to css/endWeek/endWeekAnim.css diff --git a/css/endWeek/slavesReport.css b/css/endWeek/slavesReport.css new file mode 100644 index 0000000000000000000000000000000000000000..f07dbecbe1e82f6363fb316a8bff981287e33acf --- /dev/null +++ b/css/endWeek/slavesReport.css @@ -0,0 +1,4 @@ +div.slave-report { + margin-top: 1em; + margin-bottom: 1em; +} diff --git a/src/facilities/facilities.css b/css/facilities/facilities.css similarity index 100% rename from src/facilities/facilities.css rename to css/facilities/facilities.css diff --git a/src/facilities/farmyard/farmyard.css b/css/facilities/farmyard.css similarity index 100% rename from src/facilities/farmyard/farmyard.css rename to css/facilities/farmyard.css diff --git a/src/facilities/incubator/incubator.css b/css/facilities/incubator.css similarity index 100% rename from src/facilities/incubator/incubator.css rename to css/facilities/incubator.css diff --git a/src/facilities/nursery/nursery.css b/css/facilities/nursery.css similarity index 69% rename from src/facilities/nursery/nursery.css rename to css/facilities/nursery.css index f2276b59eeaa1d146949dd10b1c48286e0e3b609..b9de00814e2aac8a1eb9f28a38ea1169985b95d0 100644 --- a/src/facilities/nursery/nursery.css +++ b/css/facilities/nursery.css @@ -1,5 +1,3 @@ -/* FEEL FREE TO MOVE */ - .child-section { margin-top: 1em; margin-bottom: 1em; diff --git a/src/facilities/pit/pit.css b/css/facilities/pit.css similarity index 100% rename from src/facilities/pit/pit.css rename to css/facilities/pit.css diff --git a/src/facilities/statistics.css b/css/facilities/statistics.css similarity index 61% rename from src/facilities/statistics.css rename to css/facilities/statistics.css index 91320c60544b476fb4f354b35bdc4ce5e865ca77..092409605f4aa23e6ff477e4b9d2391283795252 100644 --- a/src/facilities/statistics.css +++ b/css/facilities/statistics.css @@ -1,46 +1,46 @@ -table.stats { +table.facility-stats { width: 100%; padding-left: 20px; padding-right: 20px; } -table.stats > tr.header { +table.facility-stats > tr.header { border-bottom: 2px solid white; } -table.stats > tr.total { +table.facility-stats > tr.total { border-top: 1px solid white; } -table.stats > tr > th.narrow { +table.facility-stats > tr > th.narrow { width: 10em; text-align: right; } -table.stats > tr > th.wide { +table.facility-stats > tr > th.wide { width: 20em; text-align: right; } -table.stats-slave { +table.facility-stats-slave { width: 100%; font-size: 90%; line-height: 110%; } -table.stats-slave > tr { +table.facility-stats-slave > tr { border-bottom: 1px solid #aaa; border-left: none; border-right: none; border-top: none } -table.stats-slave > tr > th.narrow { +table.facility-stats-slave > tr > th.narrow { width: 11em; text-align: right; } -table.stats-slave > tr > th.wide { +table.facility-stats-slave > tr > th.wide { width: 22em; text-align: right; } @@ -52,4 +52,4 @@ td.value { .decimalZero { opacity: 0.3; -} \ No newline at end of file +} diff --git a/src/facilities/wardrobe/wardrobeShopping.css b/css/facilities/wardrobe.css similarity index 100% rename from src/facilities/wardrobe/wardrobeShopping.css rename to css/facilities/wardrobe.css diff --git a/css/general/formatting.css b/css/general/formatting.css new file mode 100644 index 0000000000000000000000000000000000000000..b0a408d0c50b27bd40e337e754731380ccefb372 --- /dev/null +++ b/css/general/formatting.css @@ -0,0 +1,71 @@ +/* Styles that mainly affect how text looks, but not where it is */ + +/* setting at the beginning of a scene / subscene */ +.scene-intro { + font-style: italic; +} + +/* adds detail to an option: Do something. <span class="detail">Sentence that explains the effect/conditions */ +.detail { + font-style: italic; +} + +/* additional information not related to a specific option */ +.note { + font-style: italic; +} + +.icons { + font-family: 'tme-fa-icons'; +} + +.story-label, .regularParties, .underline { + text-decoration: underline; +} + +/* Note: Do not do a linebreak after span in HTML, because it will underline the automatic space it inserts: "Matilda_is a cow" */ +.slave-name { + color: pink; + font-weight: bold; + text-decoration: underline; + text-decoration-color: white; +} + +.name { + font-weight: bold; +} + +.custom-label { + color: yellow; + font-weight: bold; +} + +/* strong is deprecated, use bold instead */ +.major-link, .bold, .strong { + font-weight: bold; +} + +.clear-formatting { + color: white; + font-weight: normal; + font-style: normal; +} + +.major-warning { + font-weight: bold; + color: red; +} + +input:invalid { + border-color: #900; + background-color: rgba(255, 0, 0, 0.25); +} + +input:focus:invalid { + outline: none; +} + +input:out-of-range { + background-color: rgba(255, 0, 0, 0.25); + border: 2px solid #900; +} diff --git a/css/general/layout.css b/css/general/layout.css new file mode 100644 index 0000000000000000000000000000000000000000..6d5fa3a1b13e5d428190a773473115da02a90708 --- /dev/null +++ b/css/general/layout.css @@ -0,0 +1,43 @@ +/* Styles that mainly affect where text is, but not how it looks */ + +h1, h2, h3 { + margin-bottom: 0; + margin-top: 0.25em; +} + +h1 + p, h2 + p, h3 + p { + margin-top: 0; +} + +div.center, p.center { + margin-left: auto; + margin-right: auto; + text-align: center; +} + +div.flex-container { + display: flex; +} + +/* makes the first line indented */ +div.indent, p.indent { + text-indent: 2em; +} + +div.double-indent, p.double-indent { + text-indent: 4em; +} + +/* makes avery line indented */ +.choices, .choices { + margin-left: 2em; +} + +.double-choices, .double-choices { + margin-left: 4em; +} + +div.grid-2columns-auto { + display: grid; + grid-template-columns: max-content auto; +} diff --git a/css/general/textColors.css b/css/general/textColors.css new file mode 100644 index 0000000000000000000000000000000000000000..3b1292571e8b0bf5ccf11b7593e46e9c4440c4b6 --- /dev/null +++ b/css/general/textColors.css @@ -0,0 +1,201 @@ +/* Colors are made as css classes, to allow them to be changed for a light color scheme (for example). */ +/* a version is for this case: <span class="..."><a>text</a></span> */ + +/* link color */ +.link, .link a { + color: var(--link-color) +} + +.aquamarine, .aquamarine a, .skill, .skill a { + color: aquamarine +} + +.coral, .coral a, .fetish.loss, .fetish.loss a { + color: coral +} + +/* used for aphrodisiac & neighbor arcs */ +.cyan, .cyan a, .hotkey { + color: cyan +} + +.darkgoldenrod, .darkgoldenrod a, .trust.extremely-terrified, .trust.extremely-terrified a { + color: darkgoldenrod +} + +.darkred, .darkred a, .defiant.full, .defiant.full a { + color: darkred +} + +.darkviolet, .darkviolet a, .devotion.hateful, .devotion.hateful a { + color: darkviolet +} + +/* used for devotion once & agent */ +.deeppink, .deeppink a, .devotion.devoted, .devotion.devoted a { + color: deeppink +} + +.steelblue, .steelblue a { + color: steelblue +} + +.deepskyblue, .deepskyblue a, .intelligent, .intelligent a { + color: deepskyblue +} + +.dodgerblue, .dodgerblue a { + color: dodgerblue +} + +.blue, .blue a { + color: blue +} + +.gold, .gold a, .trust.dec, .trust.dec a, .trust.frightened, .trust.frightened a { + color: gold +} + +.goldenrod, .goldenrod a, .trust.terrified, .trust.terrified a { + color: goldenrod +} + +.gray, .gray a { + color: gray +} + +.green, .green a, .reputation.inc, .reputation.inc a, .improvement, .improvement a, .flaw.break, .flaw.break a, +.skill.inc, .skill.inc a, .fuckdoll, .fuckdoll a, .positive, .positive a, .health.inc, .health.inc a { + color: green +} + +.hotpink, .hotpink a, .devotion.inc, .devotion.inc a, .devotion.accept, .devotion.accept a { + color: hotpink +} + +.lawngreen, .lawngreen a { + color: lawngreen +} + +.lightblue, .lightblue a { + color: lightblue +} + +/* compare pink for fetish */ +.lightcoral, .lightcoral a, .fetish.gain, .fetish.gain a { + color: lightcoral +} + +.lightgreen, .lightgreen a, .relationship, .relationship a, .rivalry.dec, .rivalry.dec a { + color: lightgreen +} + +.lightpink, .lightpink a { + color: lightpink +} + +.lightsalmon, .lightsalmon a, .fetish.inc, .fetish.inc a, .rivalry.inc, .rivalry.inc a, +.relationship.dec, .relationship.dec a { + color: lightsalmon +} + +/* tight orifices, breast changes, take virginity, not sure on good aliases */ +.lime, .lime a, .change.positive, .change.positive a, .virginity.loss, .virginity.loss a, .puberty, .puberty a, +.pregnant, .pregnant a { + color: lime +} + +/* multiple questionable uses */ +.limegreen, .limegreen a { + color: limegreen +} + +.magenta, .magenta a, .devotion.worship, .devotion.worship a { + color: magenta +} + +.mediumaquamarine, .mediumaquamarine a, .trust.inc, .trust.inc a, .trust.careful, .trust.careful a { + color: mediumaquamarine +} + +.mediumorchid, .mediumorchid a, .devotion.dec, .devotion.dec a, .devotion.resistant, .devotion.resistant a { + color: mediumorchid +} + +.mediumseagreen, .mediumseagreen a, .trust.trusting, .trust.trusting a { + color: mediumseagreen +} + +/* generally between red and green, and a lot of other places */ +.orange, .orange a, .stupid, .stupid a, .change.negative, .change.negative a, .defiant.careful, .defiant.careful a, +.ncs, .ncs a, .miscarriage, .miscarriage a, .intro.question { + color: orange +} + +.orangered, .orangered a, .defiant.inc, .defiant.inc a, .defiant.bold, .defiant.bold, .education.neg a { + color: orangered +} + +/* used once (wrong? */ +.orchid, .orchid a { + color: orchid +} + +/* also fetish start ??? , and a lot of other stuff */ +.pink, .pink a, .slave.name.simple { + color: pink +} + +/* generally bad stuff */ +/* note: .error is for unexpected behavior, .warning for player feedback */ +.red, .red a, .health.dec, .health.dec a, .cash.dec, .cash.dec a, .stat.drop, .stat.drop a, .flaw.gain, .flaw.gain a, +.mindbreak, .mindbreak a, .error, .error a, .elites.loss, .elites.loss a, .reputation.dec, .reputation.dec a, +.warning, .warning a { + color: red +} + +.seagreen, .seagreen a, .trust.prof-trusting, .trust.prof-trusting a { + color: seagreen +} + +.springgreen, .springgreen a, .skill.player, .skill.player a { + color: springgreen +} + +/* some ethnicity */ +.tan, .tan a { + color: tan +} + +.chocolate, .chocolate a { + color: chocolate +} + +.saddlebrown, .saddlebrown a { + color: saddlebrown +} + +.teal, .teal a { + color: teal +} + +.yellow, .yellow a, .noteworthy, .noteworthy a, .paraphilia.gain, .paraphilia.gain a, +.devotion.ambivalent, .devotion.ambivalent a, .trust.fearful, .trust.fearful a, .job.change { + color: yellow +} + +.yellowgreen, .yellowgreen a, .cash.inc, .cash.inc a, .cash, .cash a { + color: yellowgreen +} + +.white a { + color: white +} + +.violet, .libido.inc { + color: violet +} + +.khaki, .libido.dec { + color: khaki +} diff --git a/src/gui/css/accordion.css b/css/gui/accordion.css similarity index 100% rename from src/gui/css/accordion.css rename to css/gui/accordion.css diff --git a/src/gui/Encyclopedia/encyclopedia.css b/css/gui/encyclopedia.css similarity index 100% rename from src/gui/Encyclopedia/encyclopedia.css rename to css/gui/encyclopedia.css diff --git a/css/gui/favorite.css b/css/gui/favorite.css new file mode 100644 index 0000000000000000000000000000000000000000..e6069066bcdaa3aa9953bb5751391e7a0e2605b3 --- /dev/null +++ b/css/gui/favorite.css @@ -0,0 +1,9 @@ +.favorite, .favorite:hover { + color: yellow; + text-decoration: none; +} + +.not-favorite, .not-favorite:hover { + color: grey; + text-decoration: none; +} diff --git a/src/gui/options/hotkeySettings.css b/css/gui/hotkeySettings.css similarity index 100% rename from src/gui/options/hotkeySettings.css rename to css/gui/hotkeySettings.css diff --git a/css/gui/linksStrip.css b/css/gui/linksStrip.css new file mode 100644 index 0000000000000000000000000000000000000000..2ae24c635862ceb42a6a35fbaf6b12049055aafe --- /dev/null +++ b/css/gui/linksStrip.css @@ -0,0 +1,20 @@ +ul.choicesStrip { + display: inline; + list-style-type: none; + padding: 0mm; + margin-left: 0em; +} + +ul.choicesStrip li { + display: inline; +} + +ul.choicesStrip li + li:before { + content: " | "; +} + +a.disabled { + color: white; + pointer-events: none; + cursor: default; +} diff --git a/src/gui/css/options.css b/css/gui/options.css similarity index 100% rename from src/gui/css/options.css rename to css/gui/options.css diff --git a/src/003-assets/CSS/quicklinks.css b/css/gui/quicklinks.css similarity index 100% rename from src/003-assets/CSS/quicklinks.css rename to css/gui/quicklinks.css diff --git a/src/003-assets/CSS/cardStyle.css b/css/gui/slaveList/cardStyle.css similarity index 100% rename from src/003-assets/CSS/cardStyle.css rename to css/gui/slaveList/cardStyle.css diff --git a/src/gui/css/quickListCSS.css b/css/gui/slaveList/quickListCSS.css similarity index 100% rename from src/gui/css/quickListCSS.css rename to css/gui/slaveList/quickListCSS.css diff --git a/src/003-assets/CSS/slaveList.css b/css/gui/slaveList/slaveList.css similarity index 90% rename from src/003-assets/CSS/slaveList.css rename to css/gui/slaveList/slaveList.css index 1622a6a9f60b779856d1aa0468867cb8aadfaf3e..a88ed7430ab4fa4a8937d62476a57f45b9d22ae1 100644 --- a/src/003-assets/CSS/slaveList.css +++ b/css/gui/slaveList/slaveList.css @@ -20,7 +20,3 @@ span.freeAssignment { margin-right: 2em; text-indent: 0; } - -.strong { - font-weight: bold; -} diff --git a/src/003-assets/CSS/tabs.css b/css/gui/tabs.css similarity index 100% rename from src/003-assets/CSS/tabs.css rename to css/gui/tabs.css diff --git a/css/gui/tooltips/hasTooltip.css b/css/gui/tooltips/hasTooltip.css new file mode 100644 index 0000000000000000000000000000000000000000..1eaca7af0ac5c88d57e07a07314f5ac8ab93b4eb --- /dev/null +++ b/css/gui/tooltips/hasTooltip.css @@ -0,0 +1,21 @@ +/* TODO unify tooltip systems */ +.hasTooltip { + text-decoration: underline; +} + +/* interactable tooltip-like container - created/destroyed dynamically */ +.details-overlay { + display: inline-block; + font-size: smaller; + width: max-content; + height: max-content; + border-style: solid; + border-color: slategray; + border-width: 2px; + border-radius: 3px; + background-color: rgb(17, 17, 17); + padding: 3px; + position: absolute; + z-index: 2; + text-indent: 0; +} diff --git a/css/gui/tooltips/textWithTooltip.css b/css/gui/tooltips/textWithTooltip.css new file mode 100644 index 0000000000000000000000000000000000000000..60036f7ff6dfdb4509470a83523403b9c0b68d5f --- /dev/null +++ b/css/gui/tooltips/textWithTooltip.css @@ -0,0 +1,48 @@ +/* TODO unify tooltip systems */ +.textWithTooltip { + position: relative; + display: inline-block; + text-decoration: underline; + text-decoration-color: lightblue; +} + +.textWithTooltip .tooltip { + visibility: hidden; + display: block; + font-size: smaller; + width: 20em; + margin-left: -10em; + background-color: rgb(29, 30, 32); + text-align: center; + border-radius: 3px; + padding: 3px; + position: absolute; + z-index: 1; + bottom: 100%; + left: 50%; +} + +.textWithTooltip .tooltip ul { + margin-left: 5px; + margin-right: 0px; + padding-left: 10px; + padding-right: 0px; + text-align: left; +} + +.textWithTooltip .tooltip::after { + content: ""; + position: absolute; + top: 100%; + left: 50%; + margin-left: -5px; + border-width: 5px; + border-style: solid; + border-color: #555 transparent transparent transparent; +} + +.textWithTooltip:hover .tooltip { + visibility: visible; + opacity: 1; + transition-delay: 0.3s; +} diff --git a/css/interaction/export.css b/css/interaction/export.css new file mode 100644 index 0000000000000000000000000000000000000000..72eabfbdb7af31eb594f96cf15d088517b088ca2 --- /dev/null +++ b/css/interaction/export.css @@ -0,0 +1,6 @@ +div.output { + width: 100vw; + max-width: 100%; + word-break: break-all; + white-space: normal; +} diff --git a/src/gui/css/familyTree.css b/css/interaction/familyTree.css similarity index 100% rename from src/gui/css/familyTree.css rename to css/interaction/familyTree.css diff --git a/src/003-assets/CSS/gridTemplates.css b/css/interaction/prosthetics.css similarity index 75% rename from src/003-assets/CSS/gridTemplates.css rename to css/interaction/prosthetics.css index bdc2adf2e7f4ce6c1b970d3059b45c2dcb7cf382..0b6a4b4b2dec88df4948f78efe87e67b5327fd0b 100644 --- a/src/003-assets/CSS/gridTemplates.css +++ b/css/interaction/prosthetics.css @@ -1,12 +1,3 @@ -/* general use */ -div.grid-2columns-auto { - display: grid; - grid-template-columns: max-content auto; -} - -/* specific uses */ - -/* limb selector in limbs.js */ div.limb-selector { display: grid; grid-template-columns: 200px 100px 100px 100px 100px; @@ -18,7 +9,6 @@ div.limb-selector div.full { text-align: center; } -/* prostheticConfig.tw */ div.eyeContainer { display: grid; grid-template-columns: 80px 50px 70px 50px; diff --git a/css/interaction/slaveInteract.css b/css/interaction/slaveInteract.css new file mode 100644 index 0000000000000000000000000000000000000000..587ffa7234093ab4d043479cc9ee4c0b403336a8 --- /dev/null +++ b/css/interaction/slaveInteract.css @@ -0,0 +1,7 @@ +.adjacent-slave { + font-weight: bold; +} + +.interact-name { + margin: 0 2em; +} diff --git a/src/interaction/wardrobe.css b/css/interaction/wardrobe.css similarity index 100% rename from src/interaction/wardrobe.css rename to css/interaction/wardrobe.css diff --git a/src/events/intro/customizeSlaveTrade/customizeSlaveTrade.css b/css/intro/customizeSlaveTrade.css similarity index 100% rename from src/events/intro/customizeSlaveTrade/customizeSlaveTrade.css rename to css/intro/customizeSlaveTrade.css diff --git a/src/003-assets/CSS/table.css b/css/manage/budget.css similarity index 72% rename from src/003-assets/CSS/table.css rename to css/manage/budget.css index d71878e44483a7243eb66aa161bf63a4a53419a2..eca4573e7de36fe73373de9e5aa2346db05897aa 100644 --- a/src/003-assets/CSS/table.css +++ b/css/manage/budget.css @@ -1,16 +1,3 @@ -table.wardrobe { - text-align: left; - border-collapse: separate; - border-spacing: 5px; - /*border-style: hidden;*/ - /*empty-cells: hide;*/ - width: 900px -} -table.wardrobe td { - width: 50%; - border: 1px solid white; -} - table.budget { text-align: right; border-collapse: separate; diff --git a/css/manage/main.css b/css/manage/main.css new file mode 100644 index 0000000000000000000000000000000000000000..3b1c3042dd81fd8e6ed1c4756b96fd8921e051d1 --- /dev/null +++ b/css/manage/main.css @@ -0,0 +1,4 @@ +.main-fcnn { + text-align: center; + margin: 0 auto; +} diff --git a/css/manage/manage.css b/css/manage/manage.css new file mode 100644 index 0000000000000000000000000000000000000000..9b5838df9f4b328cc5549a4763a8b2e36915d9e3 --- /dev/null +++ b/css/manage/manage.css @@ -0,0 +1,6 @@ +/* puts a div in the right upper corner while not influencing the layout of the rest of the page */ +div.cheat-menu { + font-style: italic; + position: absolute; + right: 50px; +} diff --git a/src/neighbor/neighborDisplay.css b/css/neighbor/neighborDisplay.css similarity index 100% rename from src/neighbor/neighborDisplay.css rename to css/neighbor/neighborDisplay.css diff --git a/src/npc/interaction/slaveOnSlaveFeeding/slaveOnSlaveFeeding.css b/css/npc/slaveOnSlaveFeeding.css similarity index 98% rename from src/npc/interaction/slaveOnSlaveFeeding/slaveOnSlaveFeeding.css rename to css/npc/slaveOnSlaveFeeding.css index e4fb2cc907eab6d4d2fc07e8aef967eeb0ec919a..bb7e81979fb99693ae0f5b52904a374e0c06bfd1 100644 --- a/src/npc/interaction/slaveOnSlaveFeeding/slaveOnSlaveFeeding.css +++ b/css/npc/slaveOnSlaveFeeding.css @@ -4,4 +4,4 @@ table.slave-on-slave-feeding { table.slave-on-slave-feeding tr { vertical-align: top; -} \ No newline at end of file +} diff --git a/css/rulesAssistant/raLists.css b/css/rulesAssistant/raLists.css new file mode 100644 index 0000000000000000000000000000000000000000..70cd924e242db5577c85ede9dd4c92025361e5e3 --- /dev/null +++ b/css/rulesAssistant/raLists.css @@ -0,0 +1,41 @@ +.rajs-list-item { + display: inline-block; + color: var(--link-color); + margin-right: 1em; +} + +.rajs-list-item.selected { + color: gray; + text-decoration: none; +} + +.rajs-list-item:last-of-type { + margin-right: 0; +} + +.rajs-list-item:hover { + cursor: pointer; + text-decoration: underline; +} + +.rajs-list-item.selected:hover { + cursor: default; + text-decoration: none; +} + +.rajs-list strong:first-of-type, .rajs-list input { + margin-right: 2em; +} + +.rajs-list-item input { + margin: 0.25em; +} + +.rajs-section h1 { + border-bottom: 1px solid white; + cursor: pointer; +} + +.rajs-section h1:hover { + text-decoration: underline; +} diff --git a/src/003-assets/CSS/RAoptions.css b/css/rulesAssistant/raOptions.css similarity index 99% rename from src/003-assets/CSS/RAoptions.css rename to css/rulesAssistant/raOptions.css index 3a3c4fcc3d53779a892516ff7aedc21e424ff436..079895f20ae600c74c1b04f739d18d4529700d98 100644 --- a/src/003-assets/CSS/RAoptions.css +++ b/css/rulesAssistant/raOptions.css @@ -4,33 +4,40 @@ vertical-align: middle; -webkit-user-select:none; -moz-user-select:none; -ms-user-select: none; } + .ra-onoffswitch-checkbox { display: none; } + .ra-onoffswitch-label { display: block; overflow: hidden; cursor: pointer; border: 2px solid #999999; border-radius: 2px; } + .ra-onoffswitch-inner { display: block; width: 200%; margin-left: -100%; transition: margin 0.3s ease-in 0s; } + .ra-onoffswitch-inner:before, .ra-onoffswitch-inner:after { display: block; float: left; width: 50%; height: 3.5ex; padding: 0; line-height: 3.5ex; font-size: x-small; color: white; font-family: FreeSans, sans-serif; font-weight: bold; box-sizing: border-box; } + .ra-onoffswitch-inner:before { content: "ON"; padding-left: 7px; background-color: #111111; color: #FFFFFF; } + .ra-onoffswitch-inner:after { content: "OFF"; padding-right: 7px; background-color: #111111; color: #D9D9D9; text-align: right; } + .ra-onoffswitch-switch { display: block; width: 1.5em; margin: 1px; background: #8A8A8A; @@ -39,13 +46,16 @@ border: 2px solid #414141; border-radius: 2px; transition: all 0.3s ease-in 0s; } + .ra-onoffswitch-checkbox:checked + .ra-onoffswitch-label .ra-onoffswitch-inner { margin-left: 0; } + .ra-onoffswitch-checkbox:checked + .ra-onoffswitch-label .ra-onoffswitch-switch { right: 0px; background-color: #2D80E0; } + .ra-radio-label { margin: 0.5em; } diff --git a/css/rulesAssistant/raSummary.css b/css/rulesAssistant/raSummary.css new file mode 100644 index 0000000000000000000000000000000000000000..b9734d8fc017ea4f50347937dd2f3aa377bdfc3c --- /dev/null +++ b/css/rulesAssistant/raSummary.css @@ -0,0 +1,3 @@ +.scroll { + overflow: auto; +} diff --git a/js/003-data/gameVariableData.js b/js/003-data/gameVariableData.js index b859b9718de84ccb55cad8f0f9e0a02895929dcc..15d295d1db54e7e4953cf219bf72dd1c859cec38 100644 --- a/js/003-data/gameVariableData.js +++ b/js/003-data/gameVariableData.js @@ -163,7 +163,7 @@ App.Data.defaultGameStateVariables = { summaryStats: 0, surnameOrder: 0, /** @type {Object.<string, string>} */ - tabChoice: {Main: "all"}, + tabChoice: { Main: "all" }, universalRulesAssignsSelfFacility: 0, universalRulesBirthing: 0, universalRulesCSec: 0, @@ -342,7 +342,7 @@ App.Data.resetOnNGPlus = { }, /** @type {assistant} */ assistant: {}, - targetArcology: {fs: "New"}, + targetArcology: { fs: "New" }, readySlaves: 0, plot: 1, @@ -782,6 +782,11 @@ App.Data.resetOnNGPlus = { smartVaginalAttachments: 0, }, }, + customItem: { + /** @type {Map<string, slaveButtplugs>} */ + buttPlugs: new Map([]), + dildos: new Map([]), + }, dairyPiping: 0, milkPipeline: 0, cumPipeline: 0, @@ -911,11 +916,11 @@ App.Data.resetOnNGPlus = { ui: "start", tooltipsEnabled: 0, - brandTarget: {primary: "left buttock", secondary: "left buttock", local: "left buttock"}, - brandDesign: {primary: "your initials", official: "your initials", local: "your initials"}, + brandTarget: { primary: "left buttock", secondary: "left buttock", local: "left buttock" }, + brandDesign: { primary: "your initials", official: "your initials", local: "your initials" }, - scarTarget: {primary: "left cheek", secondary: "left cheek", local: "left cheek"}, - scarDesign: {primary: "generic", local: "generic"}, + scarTarget: { primary: "left cheek", secondary: "left cheek", local: "left cheek" }, + scarDesign: { primary: "generic", local: "generic" }, oralTotal: 0, vaginalTotal: 0, @@ -1000,6 +1005,7 @@ App.Data.resetOnNGPlus = { animalTesticles: 0, /* {pigTestes: 0, dogTestes: 0, horseTestes: 0, cowTestes: 0} currently unused*/ animalMpreg: 0, /* {pigMpreg: 0, dogMpreg: 0, horseMpreg: 0, cowMpreg: 0} currently unused*/ geneticMappingUpgrade: 0, + toyShop: false, pregnancyMonitoringUpgrade: 0, cloningSystem: 0, geneticFlawLibrary: 0, diff --git a/js/003-data/slaveWearData.js b/js/003-data/slaveWearData.js index acce98a8329fa781d6d392059ee753aa1f261429..8cab5e39f1d0c3014ffd3718bef01027589d2894 100644 --- a/js/003-data/slaveWearData.js +++ b/js/003-data/slaveWearData.js @@ -828,7 +828,7 @@ App.Data.clothes = new Map([ */ /** - * @typedef {Map<string, slaveWear|slaveWearChastity>} slaveWearCategory + * @typedef {Map<string, slaveWear>} slaveWearCategory */ /** @type {Object.<string, slaveWearCategory>} */ @@ -983,53 +983,6 @@ App.Data.slaveWear = { ] ]), - vaginalAccessories: new Map([ - ["none", {name: "None"}], - ["bullet vibrator", {name: "Bullet vibrator"}], - ["smart bullet vibrator", - { - name: "Smart bullet vibrator", - get requirements() { - return V.boughtItem.toys.smartVibes === 1; - } - } - ], - ["dildo", {name: "Dildo"}], - ["long dildo", - { - name: "Long dildo", - get requirements() { - return V.boughtItem.toys.dildos === 1; - } - } - ], - ["large dildo", {name: "Large dildo"}], - ["long, large dildo", - { - name: "Long, large dildo", - get requirements() { - return V.boughtItem.toys.dildos === 1; - } - } - ], - ["huge dildo", - { - name: "Huge dildo", - get requirements() { - return V.boughtItem.toys.dildos === 1; - } - } - ], - ["long, huge dildo", - { - name: "Long, huge dildo", - get requirements() { - return V.boughtItem.toys.dildos === 1; - } - } - ] - ]), - vaginalAttachments: new Map([ ["none", {name: "None"}], ["vibrator", @@ -1195,13 +1148,12 @@ App.Data.shoes = new Map([ // TODO: add lift property * @property {string} name * @property {FC.FutureSociety} [fs] Automatically unlocked with this FS. * @property {boolean} [requirements] - * @property {boolean} [harsh] - * @property {0|1|2|3} width height in cm. Adds to heel height. - * @property {0|1|2} length height in cm. Over 4cm they may totter. 21cm and over (8 inch heels) will be painful/extreme + * @property {0|1|2|3} width + * @property {0|1|2} length */ /** - * @type {Map<string, slaveButtplugs>} slaveShoesCategory + * @type {Map<string, slaveButtplugs>} */ App.Data.buttplugs = new Map([ ["none", @@ -1263,17 +1215,110 @@ App.Data.buttplugs = new Map([ } ] ]); +/** + * @typedef {object} vaginalAccessories + * @property {string} name + * @property {FC.FutureSociety} [fs] Automatically unlocked with this FS. + * @property {boolean} [requirements] + * @property {0|1|2|3} width + * @property {0|1|2} length + * @property {0|1|2} [vibrates=0] 0: none, 1: standard, 2: "smart" vibe + */ +/** + * @type {Map<string, vaginalAccessories>} + */ +App.Data.vaginalAccessories = new Map([ + ["none", + { + name: "None", + width: 0, + length: 0 + } + ], + ["bullet vibrator", + { + name: "Bullet vibrator", + width: 0, + length: 1, + vibrates: 1 + } + ], + ["smart bullet vibrator", + { + name: "Smart bullet vibrator", + get requirements() { + return V.boughtItem.toys.smartVibes === 1; + }, + width: 0, + length: 1, + vibrates: 2 + } + ], + ["dildo", + { + name: "Dildo", + width: 1, + length: 1 + } + ], + ["long dildo", + { + name: "Long dildo", + get requirements() { + return V.boughtItem.toys.dildos === 1; + }, + width: 1, + length: 2 + } + ], + ["large dildo", + { + name: "Large dildo", + width: 2, + length: 1 + } + ], + ["long, large dildo", + { + name: "Long, large dildo", + get requirements() { + return V.boughtItem.toys.dildos === 1; + }, + width: 2, + length: 2 + } + ], + ["huge dildo", + { + name: "Huge dildo", + get requirements() { + return V.boughtItem.toys.dildos === 1; + }, + width: 3, + length: 1 + } + ], + ["long, huge dildo", + { + name: "Long, huge dildo", + get requirements() { + return V.boughtItem.toys.dildos === 1; + }, + width: 3, + length: 2 + } + ] +]); /** * @typedef {object} slaveWearChastity * @property {string} name - * @property {string} value * @property {object} updateSlave * @property {FC.FutureSociety} [fs] */ /** @type {Map<string, slaveWearChastity>} */ -App.Data.slaveWear.chastityDevices = new Map([ +App.Data.chastityDevices = new Map([ // '.value' must be a string, so using update slave so I can update multiple values. ["none", { @@ -1382,3 +1427,4 @@ App.Data.slaveWear.chastityDevices = new Map([ } ] ]); + diff --git a/resources/raster/favicon/arcologyVector.html b/resources/raster/favicon/arcologyVector.html new file mode 100644 index 0000000000000000000000000000000000000000..654baa88eae790a8a1967a201a6c8a75e7413a04 --- /dev/null +++ b/resources/raster/favicon/arcologyVector.html @@ -0,0 +1,2 @@ +<!-- embedded icon so no resources folder is required to display it. --> +<link rel="shortcut icon" href="data:image/x-icon;base64,AAABAAMAQEAAAAEAIAAoQgAANgAAACAgAAABACAAqBAAAF5CAAAQEAAAAQAgAGgEAAAGUwAAKAAAAEAAAACAAAAAAQAgAAAAAAAAQAAAwQ4AAMEOAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAJKSkgCCgoJVl5eY/JmZmv+ZmZr/mZma/5mZmv+ZmZr/mZma/5mZmv+ZmZn/mZmZ/5mZmf+ZmZn/mZmZ/5mZmf+ZmZn/mZmZ/5mZmf+ZmZn/mZmZ/5mZmf+ZmZn/mZmZ/5mZmf+ZmZn/mZmZ/5mZmf+ZmZn/mZmZ/5mZmf+ZmZn/mZmZ/5mZmf+ampr/ZmZm/z4+Pv9nZ2f/jIyM/5GRkf+RkZH/kZGR/5GRkf+Ojo7/hYWF/4WFhf+FhYX/hYWF/4GBgf94eHjsZmZmMGhoaAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9+wA/vftKf/z5Ob/8N3//+/Z///t1f//6s3//+rN///qzf//9ef/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////xcXF/1RUVP9ra2v/ysrK/+vr6//t7e3/7e3t/+3t7f/t7e3/5ubm/9TU1P/T09P/09PT/9PT0//IyMj/v7+/zL+/vxG/v78AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+nLAP/pywn/6s25/+fH///kvv//4rv//9ur///aqP//2qf//+bD///+/f//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////xcXF/1JSUv9qamr/zMzM/+zs7P/t7e3/7e3t/+3t7f/t7e3/7e3t/+Li4v/T09P/09PT/9PT0//S0tL/xMTE/7+/v5u/v78Bv7+/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/qzgD/6s4A/+rOhf/py///5MD//+S////esv//26r//9up///esv//+fH/////////////////////////////////////////////////////////////////////////////////////////////////////////////////xcXF/1JSUv9qamr/zMzM//Hx8f/w8PD/7e3t/+3t7f/t7e3/7e3t/+3t7f/e3t7/09PT/9PT0//T09P/0NDQ/8HBwf+/v79pv7+/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+rOAP/qzk//6s36/+XC///kv///4bf//9uq///bqv//26r///Dc////////////////////////////////////////////////////////////////////////////////////////////////////////////xcXF/1JSUv9qamr/zMzM//Hx8f/7+/v/8PDw/+3t7f/t7e3/7e3t/+3t7f/s7Oz/2tra/9PT0//T09P/09PT/83Nzf+/v7/yv7+/PL+/vwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/t1QD/7dYk/+3U4v/nxv//5L///+O8///crf//26r//9qp///mxP///v3/////////////////////////////////////////////////////////////////////////////////////////////////xcXF/1JSUv9qamr/zMzM//Hx8f/9/f3//f39/+/v7//t7e3/7e3t/+3t7f/t7e3/6urq/9fX1//T09P/09PT/9PT0//IyMj/v7+/1L+/vxe/v78AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/7tcA//DbCf/v2bn/6cz//+XB///lwf//37T//9yt///crP//4LX///ny////////////////////////////////////////////////////////////////////////////////////////////xcXF/1JSUv9qamr/zMzM//Hx8f/9/f3///////v7+//u7u7/7e3t/+3t7f/t7e3/7e3t/+fn5//U1NT/09PT/9PT0//S0tL/xMTE/7+/v6a/v78Dv7+/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+nLAP///gD/+vSF//rz///58P//+fD///ft///26v//9uv///fr///9+v//////////////////////////////////////////////////////////////////////////////////////39/f/1dXV/9qamr/zMzM//Hy8v/9/v7////////////7+/v/7u7u/+3t7v/t7e7/7e3u/+3u7v/k5OX/09PU/9PT1P/T09T/0NDR/8HBwv+/v79vv7+/AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/9OUA//bpT//z4/r/8d3//+/a///v2f//69D//+rO///qzv//6s3//+jI///mw///5sP//+bD///mw///4bj//9+z///ftP//37T//9+0///ftP//37T//9+0///ftP//37L//+/W/87Oz/9RUVH/ubi3//XdvP/+3bH//9+0///ftP//37T/+9uw/+7Qp//t0Kf/7dCn/+3Qp//t0Kf/5Mig/9m+l//Zvpj/2b6Y/9S5kf/LsIfyybKPPMmxjAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+nNAP/pzCT/6s3i/+bF///jvv//477//96w///aqP//2qj//9qp///Yo///05j//9OX///Tl///05f//82I///IfP//yH3//8h9///Iff//yH3//8h9///Iff//yH3//8d6///htf/Pz9D/VVVW/8PBv//70pn//8h7///Iff//yH3//8h9//vFe//uu3T/7bp0/+26dP/tunT/7bp0/+Ozb//drmz/3a5s/92ubP/Xp2H/06Nb2dSjWRrUo1kAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/qzgD/6s4J/+rPuf/oyv//5L///+S////ht///26r//9uq///bqv//2qj//9Wc///Umf//1Jn//9SZ///Pjv//yX///8l////Jf///yX///8l////Jf///yX///8l////Iff//4rb/z8/Q/1RUVP/Avrv/+9Ob///Iff//yX///8l////Jf//6xXz/7bt2/+27dv/tu3b/7bt2/+y6df/gsXD/3a9u/92vbv/crmz/1KZf/9OkXbDTpF0F06RdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6s4A/+7XAP/u1oX/6s7//+XB///kv///47z//9ys///bqf//26n//9up///Xn///1Jj//9SY///Umf//0ZH//8l////Jfv//yX7//8l+///Jfv//yX7//8l+///Jfv//yHz//+K2/8/Q0P9NTU3/mJiY/+jSs///zIX//8h9///Jfv//yX7/+MN6/+27df/tu3X/7bt1/+27df/quXT/3rBu/92vbf/dr23/2qxp/9OkXf/TpF1606RcAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/x3QD/8dxP//Da+v/rzf//6cj//+nI///kvP//4bb//+G2///htv//37H//9un///bp///26f//9mj///Skv//0ZD//9GQ///RkP//0ZD//9GQ///RkP//0ZD//9CO///nwP/P0ND/S0tL/19gYP+gn5//7te4///Skv//0ZD//9GQ//jLi//uwob/7sKG/+7Chv/vw4b/6L2C/920e//dtHv/3bR7/9eucv/RqGn40admSNGnZwAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADk4dwA5eHcJNjW0+LW1ND/19PP/9fTz//X087/19LM/9fSzP/X0sz/19LM/9fRyv/X0cr/19HK/9fRyv/X0Mj/19DH/9fQx//X0Mf/19DH/9fQx//X0Mf/19DH/9fQx//Z1dD/sLCw/1VVVf+bm5v/b29v/5+fnv/Vz8f/19DH/9bQx//QysH/zMa+/8zGvv/Mxr7/zMa+/8bAuP++uLH/vrix/764sf+3san/tK6l3ryyoiG8sqMAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAdHR1AHR1dQlbW1u5WFhZ/1hYWf9YWFn/WFhY/1dXWP9XV1j/V1dY/1dXWP9XV1j/V1dY/1dXWP9XV1j/V1dY/1dXWP9XV1j/V1dY/1dXWP9XV1j/V1dY/1dXWP9XV1j/V1hY/1BQUP9QUFD/y8vL/8nJyf9sbG3/VlZX/1dXWP9XV1j/V1dY/1dYWP9XWFj/V1hY/1dYWP9XWFj/WFhZ/1hZWf9YWVn/WFlZ/1pbW7dpa20HZ2lsAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABQUFABHR0cAPj4+eT4+PuQ+Pj7hPj4+4EVFRehUVVX+VVVV/1VVVf9VVVX/VVVV/1VVVf9VVVX/VVVV/1VVVf9VVVX/VVVV/1VVVf9VVVX/VVVV/1VVVf9VVVX/VVVV/1VVVf9UVVX/Z2dn/+Dg4P//////1dXV/2tra/9TU1P/U1NT/1NTU/9TU1P/U1NT/1JSUv9QUFD/UFBQ/0VFRe0+Pj7gPj4+4T4+PuQ+Pj55R0dHABQUFAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAQEBAAEBAQAxAQEAeQEBAHigoKBu8u7pW6Ofm9+jn5v/o5+b/6Ofl/+jn5v/o6Oj/6Ofl/+jn5f/o5+X/6Ofk/+jm5P/o5uT/6Obk/+jm5P/o5uT/6Obk/+jm5P/o5uT/6Obk/+vp5v/8+vj///77///+/P/x7+3/393a/9jW1P/Y19T/2NfU/9nX1f/NzMn/wsC+/7y7uP6enZtwLS4uGkBAQB5AQEAeQEBADEBAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8dwA//HcP//w2vb/7dL//+rM///lwP//6sz///z4///qy///4LP//+Cz///apf//2KD//9ig///YoP//2KD//9ig///YoP//2KD//9ig///YoP//2KD//9ef///Wn///1p///9eg//XPmf/uyJX/7smV/+7Jlf/vyZX/5MCO/9y5iP/WtIH0z615Pc+seAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+rNAP/qzj//6cv2/+TA///huf//26n//9yt///26v//68///9OX///Tl///y4T//8h9///Iff//yH3//8h9///Iff//yH3//8h9///Iff//yH3//8h9///Iff//yH3//8h9//7Iff/yvnf/7bp0/+26dP/tunT/7bp0/+Ozb//drmz/2Khj39KiWCDUo1oAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/qzgD/6s4//+nM9v/lwf//4rr//9ur///aqP//6s7///bq///XoP//05j//8yF///Jf///yX///8l////Jf///yX///8l////Jf///yX///8l////Jf///yX///8l////Jf//+yH7/8L54/+27dv/tu3b/7bt2/+y6dv/hsnD/3K5t/9aoY8LQoFcL06RdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/6s4A/+rOP//pzPb/5cH//+K6///bq///2qj//9+z///68///37P//9OX///Mhf//yX///8l////Jf///yX///8l////Jf///yX///8l////Jf///yX///8l////Jf///yX///cd+/++9d//tu3b/7bt2/+27dv/runX/37Fv/9ytbP/VpmGgu4o1AdOkXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+vQAP/r0D//6s32/+XB///iuv//26v//9up///Yov//9Ob//+vQ///Tl///zIX//8l////Jf///yX///8l////Jf///yX///8l////Jf///yX///8l////Jf///yX///8l///vGff/uvHf/7bt2/+27dv/tu3b/6rh0/96wb//brGr/1KVfe9anYQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/v2QD/8No//+vR9v/lwf//4rr//9ur///bqf//1Zz//+nK///26v//1p///8yF///Jf///yX///8l////Jf///yX///8l////Jf///yX///8l////Jf///yX///8l////Jf//6xX3/7rt2/+27dv/tu3b/7bt2/+i3c//dr27/2qto+9OkXVDTpV4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/8NsA//DcP//s0fb/5cH//+K6///bq///26n//9Wc///drv//+vP//9+y///LhP//yX///8l////Jf///yX///8l////Jf///yX///8l////Jf///yX///8l////Jf///yX//+MR8/+27dv/tu3b/7bt2/+27dv/ltXL/3a9u/9mqZu3So1wy06RdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA//HbAP/x3D//7NL2/+XB///iuv//3Kv//9up///Wnf//1p3///Xm///s0P//y4T//8l+///Jf///yX///8l////Jf///yX///8l////Jf///yX///8l////Jf///yX///8l///bCe//tu3b/7bt2/+27dv/tu3b/47Nx/92vbv/XqGTZ0aJaGdOkXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPbw5wD28Og/9u7j9vbr3f/26tr/9ufT//bn0//25c7/9uTM//bv5v/28u3//Nim///Jfv//yX///8l////Jf///yX///8l////Jf///yX///8l////Jf///yX///8l////Jf//0wXr/7bt2/+27dv/tu3b/7Lp2/+GycP/crm3/1qdivM+gVgjTpF0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACGhocAhoaHP4aHh/aGh4f/hoeH/4aHiP+Gh4j/hoeI/4aHiP+Ghob/jIyN/8jCu//71qL//8l+///Jf///yX///8l////Jf///yX///8l////Jf///yX///8l////Jf///yX//8795/+27dv/tu3b/7bt2/+u6df/fsW//261r/9WmYJbrvoUA06RdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAPz8/AD8/Pz8/Pz/2Pz8//z8/P/8+Pj7/PT09/z09Pf89PT3/PT09/z4+Pv9sbW3/yMK6//vWov//yX7//8l////Jf///yX///8l////Jf///yX///8l////Jf///yX///sh///G+eP/tu3b/7bt2/+27dv/quHT/3rBv/9qsav/UpV9t1aZgAAAA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AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/Pz8APj4+bz4+Pv8+Pj7/Pj4+/z4+Pv8+Pj7/Pj4+/z4+Pv8+Pj7/Pj4+/z4+Pv8+Pj7/Pj4+9j4+Pj8+Pj4AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD+AAAAAAAAf/4AAAAAAAB//gAAAAAAAH//AAAAAAAA//8AAAAAAAD//wAAAAAAAP//AAAAAAAA//+AAAAAAAH//4AAAAAAAf//gAAAAAAB//+AAAAAAAH//8AAAAAAA///wAAAAAAD///AAAAAAAP//8AAAAAAA///4AAAAAAH///gAAAAAAf///4AAAAAf////gAAAAB////+AAAAAH////4AAAAAf////gAAAAD////+AAAAAP////4AAAAA/////gAAAAD////+AAAAAP////4AAAAB/////gAAAAH////+AAAAAf/////gAAAB/////+AAAAH/////4AAAAf/////gAAAD/////+AAAAP/////4AAAA//////wAAAD//////AAAAP/////8AAAA//////wAAAH//////AAAAf/////8AAAB//////wAAB///////AAAH//////8AAAf//////4AAD///////gAAP//////+AAA///////4AAD///////gAAP//////+AAB///////4AAH///////gAAf//////+AAB///////8AAP///////wAA////////AAD///////8AAP///////wAA////////AAH///////8AAf///////wAB////////AAH///////+AAf///////4AB////ygAAAAgAAAAQAAAAAEAIAAAAAAAABAAAMEOAADBDgAAAAAAAAAAAAAAAAAAAAAAAL+6tAC8uLIr0Me96NLIuf/SxbP/0sm7/9LS0f/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/S0tL/0tLS/9LS0v/T09P/0dHR/4KCgv+BgYH/wsLC/8XFxf/BwcH/srKy/7CwsP+kpKTcjo6OHZCQkAAAAAAAAAAAAAAAAAAAAAAA//DVAP/x2Q3/683D/+bB///fsP//47r///z3//////////////////////////////////////////////////39/f+1tbX/i4uL/97e3v/v7+//7+/v/+fn5//V1dX/0tLS/8XFxbe9vb0HxMTEAAAAAAAAAAAAAAAAAAAAAAD/6s4A/+bDAP/qzpD/5cL//96y///bqv//8+P////////////////////////////////////////////9/f3/s7Oz/4iJif/k5OT/9vf3/+3t7f/t7u7/4eLi/9PT0//Ozs7/wcHBhcTExQC/v78AAAAAAAAAAAAAAAAAAAAAAAAAAAD/8+MA//PiWf/w2/z/7NL//+jJ///z4v///vz///37///9+////fr///36///9+v///fr////9/729vf+Ih4b/5OLf///++//18/H/7evo/+3r6f/e3Nr/09LP/8vJx/q/vrxPwL68AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/y4AD/8+Ir/+7X6P/rz///5sP//+S////ht///37L//9ys///Wn///1p///9af///Wnf//4bf/m5ua/8y7pP//2KD//9ef//TOmP/tx5P/7ceT/+C8i//at4b/0rB95MqsfyXMroAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+rOAP/s0w3/6s3D/+bB///gs///3Kn//9mi///VmP//0pL//8p+///Jff//yX3//8h7///Xnv+ZmJf/wK+Y///MhP//yX3/9cB3/+67dP/tunP/4bFt/92taf/VpV2+0qFWC9SjWQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/79oAk5CNAOfczpDg1ML/4NG8/+DOtf/gzbP/4Mut/+DKq//gxaH/4MWg/+DFoP/gxJ//4Myw/4qKiP+HhoT/zbmf/+HFoP/WvZn/0rmX/8+3lf/Fro7/waqJ/7+lfY2ZnKEA0qVhAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABWVlcAX2BgUlhZWd9cXV7ma2xt/Wxtb/9sbW//bG1v/2xucP9sbnD/bG5w/2xucP9rbW//cXJz/8vMzv+SlJb/amtu/2prbf9pamz/ZWdp/lpbXOhWV1jfWltdUVRVVgAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADQ0NAAzMzMIIiIkG6eim0fl287v59nH/+ff1P/n2cb/59O4/+fQsv/n0LL/59Cy/+fQsv/q1LX//OfJ//TfwP/bxqn/18Km/9K9ov/BrpTwjYJySicpKxs0NDQINTU1AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAD/688A/+zQLv/ox+3/37L//+jG///lv///0I7//8qA///KgP//yoD//8qA///KgP//yX7//sh+//G/eP/uvHf/6Ld0/9ytatnVpl4a1qZfAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAP/rzwD/69Au/+fG7f/esv//3rD//+rO///Qkf//yX///8l////Jf///yX///8l////Jf//9x37/77x3/+27dv/ktXL/2atou8+fVQnTpF0AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA/+/XAP/v2C7/6Mjt/9+y///Zo///6s3//9ae///Jfv//yX///8l////Jf///yX///8l///vGff/uvHb/7bt2/+KzcP/YqmaW/9iuANOkXQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADz6NkA8+jaLvPjzu3z3b//89iz//Phyf/43bj//8qA///Jf///yX///8l////Jf///yX//+sV8/+27dv/sunb/37Fu/9eoZHDbrGoA06RdAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAG1tbQBtbW0sbW1t5G9vbvlzc3P/cXFy/4mGgv/nx5r//8uB///Jf///yX///8l////Jf//4w3v/7bt2/+u5df/dr2351qdiS9eoZAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAANjY2ADY2NgsuLi44goB9ZsvEuvPMxLj/iYiH/398eP/nx5v//8uB///Jf///yX///8l///bC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"> diff --git a/slave variables documentation - Pregmod.txt b/slave variables documentation - Pregmod.txt index 1d740d27a4f3d56e51bbb33549cc78d0af0ecac6..50ac8ed6708813151a92e4acd7c4e90aa855697f 100644 --- a/slave variables documentation - Pregmod.txt +++ b/slave variables documentation - Pregmod.txt @@ -46,7 +46,449 @@ career: career prior to enslavement accepts string -setup.gratefulCareers +App.Data.Careers.General.veryYoung +"a babysitter" +"a beggar" +"a bully hunter" +"a bully" +"a camp counselor" +"a cheerleader" +"a child actress" +"a child prodigy" +"a child prostitute" +"a child soldier" +"a club manager" +"a club recruiter" +"a club treasurer" +"a cum dump" +"a dropout" +"a drug mule" +"a farmer's daughter" +"a girl scout" +"a hall monitor" +"a handmaiden" +"a hospital volunteer" +"a housesitter" +"a juvenile delinquent" +"a latchkey kid" +"a lemonade stand operator" +"a marching band leader" +"a meat toilet" +"a military brat" +"a model-UN star" +"a model" +"a noblewoman" +"a pageant star" +"a paper girl" +"a part-time farm laborer" +"a pick-pocket" +"a refugee" +"a school nurse's assistant" +"a shrine maiden" +"a street thug" +"a street urchin" +"a student council president" +"a student from a boarding school" +"a student from a private school" +"a student from a public school" +"a sweatshop worker" +"a teacher's pet" +"an apprentice" +"an aspiring pop star" +"an idol" +"an orphan" +"being homeschooled by her parents" +"captain of the kendo club" +"from a lower class family" +"from a middle class family" +"from an upper class family" +"homeless" + +App.Data.Careers.General.young +"a babysitter" +"a ballerina" +"a barista" +"a bartender" +"a beggar" +"a blogger" +"a butler" +"a camgirl" +"a camp counselor" +"a camwhore" +"a cashier" +"a cheerleader" +"a cocktail waitress" +"a comedian" +"a con artist" +"a cook" +"a courier" +"a cowgirl" +"a criminal" +"a croupier" +"a cum dump" +"a dairy worker" +"a dancer" +"a delivery woman" +"a dominatrix" +"a drug mule" +"a factory worker" +"a farm laborer" +"a farmer's daughter" +"a florist" +"a gang member" +"a gardener" +"a groomer" +"a gymnast" +"a handmaiden" +"a house DJ" +"a housesitter" +"a housewife" +"a law enforcement officer" +"a lifeguard" +"a magician's assistant" +"a maid" +"a mail-order bride" +"a masseuse" +"a meat toilet" +"a mechanic" +"a medical student" +"a mistress" +"a model" +"a musician" +"a noblewoman" +"a nun" +"a nurse" +"a paramedic" +"a party girl" +"a personal assistant" +"a personal trainer" +"a pirate" +"a political activist" +"a porn star" +"a prisoner" +"a programmer" +"a prostitute" +"a racing driver" +"a reality show star" +"a receptionist" +"a refugee" +"a ride attendant" +"a saleswoman" +"a school nurse" +"a secretary" +"a security guard" +"a service worker" +"a shrine maiden" +"a shut-in" +"a soldier" +"a street performer" +"a street vendor" +"a stripper" +"a student" +"a switchboard operator" +"a teaching assistant" +"a tour guide" +"a trophy wife" +"a truck driver" +"a video game streamer" +"a waitress" +"a wet nurse" +"a yoga instructor" +"an actress" +"an air hostess" +"an apprentice" +"an arcade attendant" +"an artist" +"an aspiring pop star" +"an assassin" +"an athlete" +"an au pair" +"an escort" +"an exotic dancer" +"an idol" +"an installation technician" +"an intern" +"an office worker" +"homeless" +"in a militia" +"unemployed" + +App.Data.Careers.General.educated +"a ballerina" +"a banker" +"a bureaucrat" +"a business owner" +"a businessman" +"a captain" +"a chemist" +"a chief of police" +"a classical dancer" +"a classical musician" +"a coach" +"a college scout" +"a concierge" +"a coroner" +"a corporate executive" +"a cosmetologist" +"a counselor" +"a criminal" +"a critic" +"a cult leader" +"a dean" +"a dentist" +"a director" +"a dispatch officer" +"a doctor" +"a historian" +"a housekeeper" +"a journalist" +"a judge" +"a lawyer" +"a librarian" +"a lobbyist" +"a madam" +"a manager" +"a mechanic" +"a mediator" +"a medical student" +"a mercenary" +"a military officer" +"a military recruiter" +"a nanny" +"a noblewoman" +"a nun" +"a painter" +"a paramedic" +"a personal assistant" +"a pharmacist" +"a photographer" +"a physician" +"a pilot" +"a poet" +"a police detective" +"a police negotiator" +"a police officer" +"a political activist" +"a politician" +"a practitioner" +"a principal" +"a prison warden" +"a private detective" +"a private instructor" +"a procuress" +"a producer" +"a professional bartender" +"a professor" +"a programmer" +"a prostitute" +"a psychologist" +"a refugee" +"a scholar" +"a scientist" +"a sculptor" +"a secretary" +"a serial divorcee" +"a shut-in" +"a stockbroker" +"a surgeon" +"a teacher" +"a teaching assistant" +"a therapist" +"a train conductor" +"a transporter" +"a veterinarian" +"a wedding planner" +"a writer" +"a zookeeper" +"an actress" +"an air hostess" +"an animator" +"an archaeologist" +"an architect" +"an artist" +"an assassin" +"an astronaut" +"an economist" +"an editor" +"an engineer" +"an escort" +"an estate agent" +"an investor" +"an MS pilot" +"an office worker" +"an orchestra conductor" +"retired" +"unemployed" + +App.Data.Careers.General.uneducated +"a baker" +"a barber" +"a barista" +"a bartender" +"a beekeeper" +"a beggar" +"a blacksmith" +"a blogger" +"a bodyguard" +"a bouncer" +"a bounty hunter" +"a boxer" +"a brewer" +"a bullfighter" +"a bus driver" +"a butcher" +"a butler" +"a camgirl" +"a camp counselor" +"a camwhore" +"a candlestick maker" +"a caregiver" +"a carpenter" +"a cashier" +"a charity worker" +"a chauffeur" +"a cheerleader" +"a chiropractor" +"a clown" +"a cobbler" +"a cocktail waitress" +"a comedian" +"a con artist" +"a construction worker" +"a cook" +"a cowgirl" +"a criminal" +"a croupier" +"a cum dump" +"a dairy worker" +"a dancer" +"a delivery woman" +"a dominatrix" +"a driller" +"a drug mule" +"a factory worker" +"a farm laborer" +"a farmer's daughter" +"a farmer" +"a firefighter" +"a fisherwoman" +"a florist" +"a fortune teller" +"a gang leader" +"a gang member" +"a gardener" +"a gravedigger" +"a groomer" +"a gymnast" +"a handmaiden" +"a hotel manager" +"a house DJ" +"a housewife" +"a hunter" +"a janitor" +"a landlady" +"a launderer" +"a law enforcement officer" +"a lifeguard" +"a local news anchor" +"a lumberjack" +"a magician's assistant" +"a maid" +"a mail carrier" +"a mail-order bride" +"a masseuse" +"a meat toilet" +"a medic" +"a medium" +"a messenger" +"a midwife" +"a milkmaid" +"a mime" +"a miner" +"a missionary" +"a mistress" +"a model" +"a mortician" +"a musician" +"a nanny" +"a nurse" +"a paramedic" +"a park ranger" +"a party girl" +"a peddler" +"a personal trainer" +"a pimp" +"a pirate" +"a plumber" +"a political activist" +"a prison guard" +"a prisoner" +"a procuress" +"a prostitute" +"a racing driver" +"a radio show host" +"a rancher" +"a receptionist" +"a referee" +"a refugee" +"a repairman" +"a revolutionary" +"a ride attendant" +"a roadie" +"a rodeo star" +"a sailor" +"a saleswoman" +"a school nurse" +"a seamstress" +"a secretary" +"a security guard" +"a service worker" +"a shepherd" +"a shrine maiden" +"a soldier" +"a stage magician" +"a street performer" +"a street vendor" +"a stripper" +"a student" +"a student athlete" +"a stuntwoman" +"a switchboard operator" +"a tailor" +"a talent scout" +"a taxi driver" +"a teacher" +"a tour guide" +"a trophy wife" +"a truck driver" +"a waitress" +"a weathergirl" +"a welder" +"a wet nurse" +"a whaler" +"a wrestler" +"a zookeeper" +"an acrobat" +"an actress" +"an arcade attendant" +"an artist" +"an aspiring pop star" +"an athlete" +"an electrician" +"an enforcer" +"an escort" +"an exotic dancer" +"an exterminator" +"an innkeeper" +"an installation technician" +"an office worker" +"an orderly" +"homeless" +"in a militia" +"retired" +"unemployed" + +App.Data.Careers.General.grateful "a beggar" "a drug mule" "a peddler" @@ -63,7 +505,7 @@ setup.gratefulCareers "homeless" "unemployed" -setup.menialCareers +App.Data.Careers.General.menial "a baker" "a blacksmith" "a bus driver" @@ -129,7 +571,7 @@ setup.menialCareers "an installation technician" "an intern" -setup.entertainmentCareers +App.Data.Careers.General.entertainment "a ballerina" "a blogger" "a camgirl" @@ -166,7 +608,8 @@ setup.entertainmentCareers "an artist" "an athlete" -setup.whoreCareers +App.Data.Careers.General.whore +"a bimbo" "a child prostitute" "a criminal" "a cum dump" @@ -188,15 +631,7 @@ setup.whoreCareers "an escort" "an exotic dancer" -setup.servantCareers -"a butler" -"a cook" -"a handmaiden" -"a housewife" -"a maid" -"a shrine maiden" - -setup.HGCareers +App.Data.Careers.Leader.HG "a captain" "a corporate executive" "a director" @@ -213,7 +648,7 @@ setup.HGCareers "a slaver" "a student council president" -setup.madamCareers + App.Data.Careers.Leader.madam "a banker" "a business owner" "a businessman" @@ -229,7 +664,7 @@ setup.madamCareers "a stockbroker" "an innkeeper" -setup.DJCareers + App.Data.Careers.Leader.DJ "a classical dancer" "a classical musician" "a dancer" @@ -241,7 +676,7 @@ setup.DJCareers "an idol" "an orchestra conductor" -setup.bodyguardCareers + App.Data.Careers.Leader.bodyguard "a bodyguard" "a boxer" "a bully hunter" @@ -261,7 +696,7 @@ setup.bodyguardCareers "in a militia" "spec ops" -setup.wardenessCareers + App.Data.Careers.Leader.wardeness "a bouncer" "a bounty hunter" "a bully" @@ -279,7 +714,7 @@ setup.wardenessCareers "an enforcer" "an orderly" -setup.nurseCareers + App.Data.Careers.Leader.nurse "a chemist" "a chiropractor" "a coroner" @@ -298,7 +733,7 @@ setup.nurseCareers "a school nurse" "a surgeon" -setup.attendantCareers + App.Data.Careers.Leader.attendant "a barber" "a cosmetologist" "a counselor" @@ -315,14 +750,14 @@ setup.attendantCareers "a therapist" "a yoga instructor" -setup.matronCareers + App.Data.Careers.Leader.matron "a babysitter" "a nanny" "a practitioner" "a wet nurse" "an au pair" -setup.milkmaidCareers + App.Data.Careers.Leader.milkmaid "a cowgirl" "a dairy worker" "a farmer's daughter" @@ -330,7 +765,7 @@ setup.milkmaidCareers "a shepherd" "a veterinarian" -setup.farmerCareers + App.Data.Careers.Leader.farmer "a beekeeper" "a bullfighter" "a farmer" @@ -339,7 +774,7 @@ setup.farmerCareers "a rodeo star" "a zookeeper" -setup.stewardessCareers + App.Data.Careers.Leader.stewardess "a barista" "a bartender" "a brewer" @@ -363,7 +798,7 @@ setup.stewardessCareers "an investor" "an office worker" -setup.schoolteacherCareers + App.Data.Careers.Leader.schoolteacher "a child prodigy" "a coach" "a dean" @@ -381,7 +816,7 @@ setup.schoolteacherCareers "an astronaut" "an economist" -setup.recruiterCareers + App.Data.Careers.Leader.recruiter "a club recruiter" "a college scout" "a con artist" @@ -397,36 +832,13 @@ setup.recruiterCareers "a talent scout" "retired" -setup.otherCareers -"a bioreactor" -"a breeder" -"a breeding bull" -"a businesswoman" -"a cat burglar" -"a criminal businesswoman" -"a dairy cow" -"a dairy slave" -"a drug pusher" -"a drug smuggler" -"a fence" -"a Fuckdoll" -"a lady courtier" -"a merchant" -"a murderer" -"a priest" -"a producer" -"a slave since birth" -"a slave" -"a smuggler" -"a trophy spouse" -"a wanderer" -"a well connected individual" -"an antislavery activist" -"an arcology owner" -"an arms dealer" -"being homeschooled by her parents" -"from a middle class family" -"from an upper class family" + App.Data.Careers.Leader.servant +"a butler" +"a cook" +"a handmaiden" +"a housewife" +"a maid" +"a shrine maiden" ID: diff --git a/src/002-config/fc-version.js b/src/002-config/fc-version.js index c0159ceb1e40363fe3d02c90f290ad8926aefd46..393d11da8a111d1fbbbecb3174255714e1d76ba8 100644 --- a/src/002-config/fc-version.js +++ b/src/002-config/fc-version.js @@ -2,5 +2,5 @@ App.Version = { base: "0.10.7.1", // The vanilla version the mod is based off of, this should never be changed. pmod: "3.8.4", commitHash: null, - release: 1112 // When getting close to 2000, please remove the check located within the onLoad() function defined at line five of src/js/eventHandlers.js. + release: 1113 // When getting close to 2000, please remove the check located within the onLoad() function defined at line five of src/js/eventHandlers.js. }; diff --git a/src/002-config/fc-version.js_after.js b/src/002-config/z_after_fc-version.js similarity index 100% rename from src/002-config/fc-version.js_after.js rename to src/002-config/z_after_fc-version.js diff --git a/src/003-assets/CSS/general.css b/src/003-assets/CSS/general.css deleted file mode 100644 index f3467c9abe50b08fbfaa5a0fb83f80f058e02fe1..0000000000000000000000000000000000000000 --- a/src/003-assets/CSS/general.css +++ /dev/null @@ -1,13 +0,0 @@ -input:invalid{ - border-color: #900; - background-color: rgba(255, 0, 0, 0.25); -} - -input:focus:invalid { - outline: none; -} - -input:out-of-range { - background-color: rgba(255, 0, 0, 0.25); - border: 2px solid #900; -} diff --git a/src/003-assets/CSS/links.css b/src/003-assets/CSS/links.css deleted file mode 100644 index 5ea75b9308265e8e8d462f309f020e44ac34d277..0000000000000000000000000000000000000000 --- a/src/003-assets/CSS/links.css +++ /dev/null @@ -1,68 +0,0 @@ -.textWithTooltip { - position: relative; - display: inline-block; - text-decoration: underline; - text-decoration-color: lightblue; -} - -.textWithTooltip .tooltip { - visibility: hidden; - display: block; - font-size: smaller; - width: 20em; - margin-left: -10em; - background-color: rgb(29, 30, 32); - text-align: center; - border-radius: 3px; - padding: 3px; - position: absolute; - z-index: 1; - bottom: 100%; - left: 50%; -} - -.textWithTooltip .tooltip ul { - margin-left: 5px; - margin-right: 0px; - padding-left: 10px; - padding-right: 0px; - text-align: left; -} - -.textWithTooltip .tooltip::after { - content: ""; - position: absolute; - top: 100%; - left: 50%; - margin-left: -5px; - border-width: 5px; - border-style: solid; - border-color: #555 transparent transparent transparent; -} - -.textWithTooltip:hover .tooltip { - visibility: visible; - opacity: 1; - transition-delay: 0.3s; -} - -ul.choicesStrip { - display: inline; - list-style-type: none; - padding: 0mm; - margin-left: 0em; -} - -ul.choicesStrip li { - display: inline; -} - -ul.choicesStrip li + li:before { - content: " | "; -} - -a.disabled { - color: white; - pointer-events: none; - cursor: default; -} diff --git a/src/004-base/domPassage.js b/src/004-base/domPassage.js index e051f45dd2766e3eea75262f6bf112a4f8117782..c5bc9037593c7ba8fc742b79c4f96208f4c952f9 100644 --- a/src/004-base/domPassage.js +++ b/src/004-base/domPassage.js @@ -25,21 +25,7 @@ App.DomPassage = class extends Passage { try { return this.callback(); } catch (ex) { - const fragment = document.createDocumentFragment(); - - App.UI.DOM.appendNewElement("p", fragment, `${ex.name}: ${ex.message}`, ["bold", "error"]); - - const p = document.createElement("p"); - const lines = ex.stack.split("\n"); - for (const ll of lines) { - const div = document.createElement("div"); - // remove file path from error message - div.append(ll.replace(/file:.*\//, "<path>/")); - p.append(div); - } - fragment.append(p); - - return fragment; + return App.UI.DOM.formatException(ex); } } }; diff --git a/src/005-passages/endWeekPassages.js b/src/005-passages/endWeekPassages.js index ccc13ab8a4fe660126efcabaf4d82fe7626471cc..b039a2bed3eb32f3585a4b7c80ac6461bed695eb 100644 --- a/src/005-passages/endWeekPassages.js +++ b/src/005-passages/endWeekPassages.js @@ -1,12 +1,17 @@ new App.DomPassage("Slave Assignments Report", () => { - V.nextLink = "Economics"; V.nextButton = "Continue"; + V.nextLink = "Economics"; + V.nextButton = "Continue"; const f = document.createDocumentFragment(); - App.UI.DOM.appendNewElement("h1", f, `${V.arcologies[0].name} Weekly Slave Report - Week ${V.week}`); - f.append(App.EndWeek.slaveAssignmentReport()); - App.UI.EndWeekAnim.end(); + try { + App.UI.DOM.appendNewElement("h1", f, `${V.arcologies[0].name} Weekly Slave Report - Week ${V.week}`); + f.append(App.EndWeek.slaveAssignmentReport()); + } finally { + // whatever happens, stop the end week animation so we at least know there is an error. + App.UI.EndWeekAnim.end(); + } return f; } diff --git a/src/005-passages/facilitiesPassages.js b/src/005-passages/facilitiesPassages.js index 0a372a4f922ae23e0d70ba36c8b93d31a79ab590..0fcb73572a5b57709a5a37271459a350aeddc86b 100644 --- a/src/005-passages/facilitiesPassages.js +++ b/src/005-passages/facilitiesPassages.js @@ -68,3 +68,12 @@ new App.DomPassage("Rules Assistant", return div; }, ["jump-to-safe", "jump-from-safe"] ); + +new App.DomPassage("Toy Shop", + () => { + V.nextButton = "Back"; + V.nextLink = "Manage Penthouse"; + + return App.UI.toyShop(); + }, ["jump-to-safe", "jump-from-safe"] +); diff --git a/src/005-passages/slaveMarketPassages.js b/src/005-passages/slaveMarketPassages.js index 9ea818ab7347c1648da5d39668e6af1a7ad1b56a..2969e72df114a05d57ee88546bc90025a0023870 100644 --- a/src/005-passages/slaveMarketPassages.js +++ b/src/005-passages/slaveMarketPassages.js @@ -1,4 +1,10 @@ -new App.DomPassage("Market", () => App.Markets[V.market.slaveMarket](), ["jump-from-safe"]); +new App.DomPassage("Market", + () => { + const span = App.UI.DOM.makeElement("span", App.Markets[V.market.slaveMarket]()); + span.id = "slave-markets"; + return span; + }, ["jump-from-safe"] +); new App.DomPassage("Buy Slaves", () => { diff --git a/src/art/vector/VectorArtJS.js b/src/art/vector/VectorArtJS.js index 05f494ec1451c625adb5cec15ef0962e1ffd8c42..d58a6ce3ed272f59a680a1cada7789984ef2df1e 100644 --- a/src/art/vector/VectorArtJS.js +++ b/src/art/vector/VectorArtJS.js @@ -1771,7 +1771,7 @@ App.Art.vectorArtElement = (function() { } else if (slave.vaginalAccessory === "long, huge dildo") { svgQueue.add("Art_Vector_Dildo_Huge_Long"); } - } /* else if (slave.vaginalAccessory === "bullet vibrator" || slave.vaginalAccessory === "smart bullet vibrator") { + } /* else if (dildoWidth(slave) === 0) { svgQueue.add("Art_Vector_Bullet_Vibrator"); } */ } diff --git a/src/data/backwardsCompatibility/updateSlaveObject.js b/src/data/backwardsCompatibility/updateSlaveObject.js index 7567a248fe8e0bf378e875e673bb34761204e9b9..7b93adc17b724f159287a3983dc643f17b736e90 100644 --- a/src/data/backwardsCompatibility/updateSlaveObject.js +++ b/src/data/backwardsCompatibility/updateSlaveObject.js @@ -926,30 +926,29 @@ App.Update.Slave = function(slave, genepool = false) { slave.pregControl = "labor suppressors"; } - if (slave.chastityAnus === undefined || slave.chastityPenis === undefined || slave.chastityVagina === undefined) { - if (slave.dickAccessory === "combined chastity") { - slave.chastityAnus = 1; - slave.chastityPenis = 1; - slave.dickAccessory = "none"; - } else if (slave.vaginalAccessory === "combined chastity") { - slave.chastityAnus = 1; - slave.chastityVagina = 1; - slave.vaginalAccessory = "none"; - } else if (slave.dickAccessory === "anal chastity" || slave.vaginalAccessory === "anal chastity") { - slave.chastityAnus = 1; - slave.dickAccessory = "none"; - slave.vaginalAccessory = "none"; - } else if (slave.dickAccessory === "chastity") { - slave.chastityPenis = 1; - slave.dickAccessory = "none"; - } else if (slave.vaginalAccessory === "chastity belt") { - slave.chastityVagina = 1; - slave.vaginalAccessory = "none"; - } else { - slave.chastityAnus = 0; - slave.chastityPenis = 0; - slave.chastityVagina = 0; - } + // Fix dickAccessory + if (slave.dickAccessory === "combined chastity") { + slave.chastityAnus = 1; + slave.chastityPenis = 1; + slave.dickAccessory = "none"; + } else if (slave.dickAccessory === "chastity") { + slave.chastityPenis = 1; + slave.dickAccessory = "none"; + } else if (slave.dickAccessory === "anal chastity") { + slave.chastityAnus = 1; + slave.dickAccessory = "none"; + } + // Fix vaginalAccessory + if (slave.vaginalAccessory === "combined chastity") { + slave.chastityAnus = 1; + slave.chastityVagina = 1; + slave.vaginalAccessory = "none"; + } else if (slave.vaginalAccessory === "chastity belt") { + slave.chastityVagina = 1; + slave.vaginalAccessory = "none"; + } else if (slave.vaginalAccessory === "anal chastity") { + slave.chastityAnus = 1; + slave.vaginalAccessory = "none"; } if (slave.rules !== undefined && slave.rules.rest === undefined) { diff --git a/src/descriptions/officeDescription.js b/src/descriptions/officeDescription.js index 4ecac53c275b09bf69800c17cb5e04b75ea9c2ce..6c38742fa843b58a7abbf5b013e0ec97dfb2e539 100644 --- a/src/descriptions/officeDescription.js +++ b/src/descriptions/officeDescription.js @@ -454,7 +454,7 @@ App.Desc.officeDescription = function(lastElement) { } r.push(` face stares back at you.`); if (V.playerAging !== 0 && V.PC.birthWeek === 51) { - r.push(`You'll be turning ${V.V.PC.actualAge + 1} next week.`); + r.push(`You'll be turning ${V.PC.actualAge + 1} next week.`); } r.push(App.Desc.Player.boobs(), App.Desc.Player.belly(), App.Desc.Player.crotch(), App.Desc.Player.butt()); diff --git a/src/endWeek/economics/reputation.js b/src/endWeek/economics/reputation.js index 66c3e8668376c8c6a44afdb57440fcdb5993ebf8..bbc9d8d15a1aedda1e9ffe6d5d1dcb8ec90b6a86 100644 --- a/src/endWeek/economics/reputation.js +++ b/src/endWeek/economics/reputation.js @@ -638,7 +638,7 @@ App.EndWeek.reputation = function() { if (V.slaves.length > 20 && V.cash > 50000) { r.push(`Society <span class="green">strongly approves</span> of your great wealth and prosperity, as is only fitting for an`); if (V.PC.customTitle) { - r.push(`${V.PC.customTitle}`); + r.push(`${V.PC.customTitle}.`); } else if (V.PC.title === 1) { r.push(`proper Imperial noble.`); } else { diff --git a/src/endWeek/reports/spaReport.js b/src/endWeek/reports/spaReport.js index d0d4f0770c1b3f351f57f31453f46ce16c9829fb..d127e367b02fe02e9085e35fdfaa42c301f1e3cc 100644 --- a/src/endWeek/reports/spaReport.js +++ b/src/endWeek/reports/spaReport.js @@ -121,7 +121,7 @@ App.EndWeek.spaReport = function() { slave.intelligence = gp.intelligence - 30; } if (V.arcologies[0].FSPaternalist !== "unset" && V.arcologies[0].FSPaternalist > 0) { - curedArray.push(`Society <span class="green">strongly approves</span> of${slave.slaveName} being restored to sanity, which advances ideals about enlightened slaveownership.`); + curedArray.push(`Society <span class="green">strongly approves</span> of ${slave.slaveName} being restored to sanity, which advances ideals about enlightened slaveownership.`); V.arcologies[0].FSPaternalist += 0.01 * V.FSSingleSlaveRep; repX(2 * V.FSSingleSlaveRep * (V.arcologies[0].FSPaternalist / V.FSLockinLevel), "spa", slave); } diff --git a/src/endWeek/saClothes.js b/src/endWeek/saClothes.js index 30075c19d6384c3c14d08d3fd865829da542269d..3a967c423c10129982072b43fcc85f44079d59ee 100644 --- a/src/endWeek/saClothes.js +++ b/src/endWeek/saClothes.js @@ -71,7 +71,7 @@ App.SlaveAssignment.clothes = (function() { slave.vaginalAccessory = "none"; slave.vaginalAttachment = "none"; } else { - if (["none", "bullet vibrator", "smart bullet vibrator"].includes(slave.vaginalAccessory)) { + if (dildoWidth(slave) === 0) { slave.vaginalAttachment = "none"; } } @@ -241,7 +241,7 @@ App.SlaveAssignment.clothes = (function() { r.push(`The outfit ${he}'s wearing constantly give ${him} little twinges of pain, <span class="hotpink">titillating ${him}.</span>`); slave.devotion += 2; } else if (slave.devotion <= 20 && slave.trust >= -50) { - r.push(`The outfit ${he}'s wearing keep ${him} <span class="hotpink">servile</span> and <span class="gold">afraid.</span>`); + r.push(`The outfit ${he}'s wearing keeps ${him} <span class="hotpink">servile</span> and <span class="gold">afraid.</span>`); slave.devotion += 1; slave.trust -= 1; if (slave.fetish === "masochist" && slave.fetishKnown === 0) { @@ -920,9 +920,10 @@ App.SlaveAssignment.clothes = (function() { * */ function vaginaAccessories(slave) { + const dildo = App.Data.vaginalAccessories.get(slave.vaginalAccessory) || V.customItem.dildos.get(slave.vaginalAccessory); if (slave.vaginalAccessory !== "none") { - if (slave.vaginalAccessory === "bullet vibrator" || slave.vaginalAccessory === "smart bullet vibrator") { - r.push(`Constantly wearing a bullet vibrator`); + if (dildo.width === 0) { + r.push(`Constantly wearing a ${slave.vaginalAccessory}`); if (slave.devotion < 20) { r.push(`habituates ${him} to sexual slavery and <span class="hotpink">increases ${his} submissiveness.</span>`); slave.devotion += 2; @@ -930,7 +931,7 @@ App.SlaveAssignment.clothes = (function() { r.push(`reminds ${him} of ${his} place and <span class="hotpink">increases ${his} devotion to you.</span>`); slave.devotion++; } - } else if (slave.vaginalAccessory === "dildo") { + } else if (dildo.width === 1) { if (slave.vagina < 1 && jsRandom(1, 100) > 50) { r.push(`Constantly wearing a dildo in ${his} virgin pussy <span class="lime">gets it used to penetration.</span>`); slave.vagina += 1; @@ -943,29 +944,16 @@ App.SlaveAssignment.clothes = (function() { slave.sexualFlaw = "none"; } } - } else if (slave.vaginalAccessory === "long dildo") { - if (slave.vagina < 1 && jsRandom(1, 100) > 50) { - r.push(`Constantly wearing a dildo in ${his} virgin pussy <span class="lime">gets it used to penetration.</span>`); - slave.vagina += 1; - } else { - r.push(`${His} pussy easily accommodates the dildo ${he}'s required to wear.`); - } - if (slave.fuckdoll === 0) { - if (slave.fetish !== "mindbroken") { - if (slave.sexualFlaw === "hates penetration" && jsRandom(1, 100) > 50) { - r.push(`The habit <span class="green">reduces ${his} dislike of having ${his} pussy filled.</span>`); - slave.sexualFlaw = "none"; - } - if (slave.sexualQuirk === "size queen") { - r.push(`Being able to hold such a long dildo is a <span class="hotpink">point of pride</span> for the ostentatious size queen.`); - slave.devotion += 2; - } else { - r.push(`It penetrates ${his} cervix causing ${him} tremendous discomfort, making ${him} a little <span class="gold">less trusting</span> of you.`); - slave.trust -= 1; - } + if (dildo.length > 1) { + if (slave.sexualQuirk === "size queen") { + r.push(`Being able to hold such a long dildo is a <span class="hotpink">point of pride</span> for the ostentatious size queen.`); + slave.devotion += 2; + } else { + r.push(`It penetrates ${his} cervix causing ${him} tremendous discomfort, making ${him} a little <span class="gold">less trusting</span> of you.`); + slave.trust -= 1; } } - } else if (slave.vaginalAccessory === "large dildo") { + } else if (dildo.width === 2) { if (slave.vagina < 3) { if (jsRandom(1, 4) === 1) { r.push(`Constantly wearing a large dildo in ${his} pussy <span class="lime">stretches it out.</span>`); @@ -979,105 +967,93 @@ App.SlaveAssignment.clothes = (function() { if (slave.fuckdoll === 0) { if (slave.fetish !== "mindbroken") { if (slave.vagina < 2) { - r.push(`The big dildo in ${his} tight cunt`); - if (slave.sexualQuirk === "size queen") { - r.push(`is a <span class="hotpink">point of pride</span> for the ostentatious size queen.`); - slave.devotion += 2; - } else { - r.push(`<span class="hotpink">breaks ${him} to sexual slavery</span> slightly.`); - slave.devotion += 1; - } - if (slave.vagina === 1) { - r.push(`It stretches ${his} tight cunt to soreness by the end of every day, so it also makes ${him} a little <span class="gold">less trusting</span> of you.`); - slave.trust -= 1; - } - } - } - } - } else if (slave.vaginalAccessory === "long, large dildo") { - if (slave.vagina < 3) { - if (jsRandom(1, 4) === 1) { - r.push(`Constantly wearing a large dildo in ${his} pussy <span class="lime">stretches it out.</span>`); - slave.vagina += 1; - } else { - r.push(`The large dildo ${he}'s required to wear is a stretch for ${his} cunt, but pussies are resilient and ${he}rs isn't seriously affected.`); - } - } else { - r.push(`${His} pussy accommodates the large dildo ${he}'s required to wear.`); - } - if (slave.vagina < 2) { - if (slave.fuckdoll === 0) { - if (slave.fetish !== "mindbroken") { - r.push(`The big, long dildo in ${his} tight cunt`); - if (slave.sexualQuirk === "size queen") { - r.push(`is a <span class="hotpink">point of pride</span> for the ostentatious size queen.`); - slave.devotion += 2; + if (dildo.length === 1) { + r.push(`The big dildo in ${his} tight cunt`); + if (slave.sexualQuirk === "size queen") { + r.push(`is a <span class="hotpink">point of pride</span> for the ostentatious size queen.`); + slave.devotion += 2; + } else { + r.push(`<span class="hotpink">breaks ${him} to sexual slavery</span> slightly.`); + slave.devotion += 1; + } + if (slave.vagina === 1) { + r.push(`It stretches ${his} tight cunt to soreness by the end of every day, so it also makes ${him} a little <span class="gold">less trusting</span> of you.`); + slave.trust -= 1; + } } else { - r.push(`<span class="hotpink">breaks ${him} to sexual slavery</span> slightly. It also penetrates ${his} cervix, causing ${him} tremendous discomfort, and making ${him} a little <span class="gold">less trusting</span> of you.`); - slave.devotion += 1; - slave.trust -= 1; - } - if (slave.vagina === 1) { - r.push(`It stretches ${his} tight cunt to soreness by the end of every day, so it also makes ${him} a little <span class="gold">less trusting</span> of you.`); - slave.trust -= 1; + r.push(`The big, long dildo in ${his} tight cunt`); + if (slave.sexualQuirk === "size queen") { + r.push(`is a <span class="hotpink">point of pride</span> for the ostentatious size queen.`); + slave.devotion += 2; + } else { + r.push(`<span class="hotpink">breaks ${him} to sexual slavery</span> slightly. It also penetrates ${his} cervix, causing ${him} tremendous discomfort, and making ${him} a little <span class="gold">less trusting</span> of you.`); + slave.devotion += 1; + slave.trust -= 1; + } + if (slave.vagina === 1) { + r.push(`It stretches ${his} tight cunt to soreness by the end of every day, so it also makes ${him} a little <span class="gold">less trusting</span> of you.`); + slave.trust -= 1; + } } } } } - } else if (slave.vaginalAccessory === "huge dildo") { - if (slave.vagina < 4) { - if (slave.fuckdoll === 0) { - if (slave.fetish !== "mindbroken") { - if (slave.sexualQuirk === "size queen") { - r.push(`${He} thinks of the massive dildo stretching out ${his} womanhood as <span class="lime">preparation for the biggest cocks,</span> and <span class="hotpink">looks forward</span> to take anything — dicks, hands, truly anything — inside ${his} newly capacious cunt.`); - slave.devotion += 4; - } else if (slave.fetish === "masochist" && slave.fetishKnown === 1 && slave.fetishStrength > 60) { - r.push(`${He} gets off on the agony of having ${his} cunt <span class="lime">permanently stretched</span> by a huge dildo. The terrible combination of pain and pleasure <span class="hotpink">breaks ${his} will</span> but fills ${him} with <span class="gold">fear.</span>`); - slave.devotion += 5; - slave.trust -= 5; - } else if (slave.fetish === "submissive" && slave.fetishKnown === 1 && slave.fetishStrength > 60) { - r.push(`${He} submits to the agony of having ${his} cunt <span class="lime">permanently stretched</span> by a huge dildo. Having ${his} hole ruined at your whim <span class="hotpink">breaks ${his} will</span> but fills ${him} with <span class="gold">fear.</span>`); - slave.devotion += 5; - slave.trust -= 5; - } else { - r.push(`The agony of having ${his} cunt <span class="lime">permanently stretched</span> by a huge dildo fills ${him} with <span class="mediumorchid">resentment</span> and <span class="gold">fear.</span>`); - slave.devotion -= 5; - slave.trust -= 5; + } else if (dildo.width === 3) { + if (dildo.length === 1) { + if (slave.vagina < 4) { + if (slave.fuckdoll === 0) { + if (slave.fetish !== "mindbroken") { + if (slave.sexualQuirk === "size queen") { + r.push(`${He} thinks of the massive dildo stretching out ${his} womanhood as <span class="lime">preparation for the biggest cocks,</span> and <span class="hotpink">looks forward</span> to take anything — dicks, hands, truly anything — inside ${his} newly capacious cunt.`); + slave.devotion += 4; + } else if (slave.fetish === "masochist" && slave.fetishKnown === 1 && slave.fetishStrength > 60) { + r.push(`${He} gets off on the agony of having ${his} cunt <span class="lime">permanently stretched</span> by a huge dildo. The terrible combination of pain and pleasure <span class="hotpink">breaks ${his} will</span> but fills ${him} with <span class="gold">fear.</span>`); + slave.devotion += 5; + slave.trust -= 5; + } else if (slave.fetish === "submissive" && slave.fetishKnown === 1 && slave.fetishStrength > 60) { + r.push(`${He} submits to the agony of having ${his} cunt <span class="lime">permanently stretched</span> by a huge dildo. Having ${his} hole ruined at your whim <span class="hotpink">breaks ${his} will</span> but fills ${him} with <span class="gold">fear.</span>`); + slave.devotion += 5; + slave.trust -= 5; + } else { + r.push(`The agony of having ${his} cunt <span class="lime">permanently stretched</span> by a huge dildo fills ${him} with <span class="mediumorchid">resentment</span> and <span class="gold">fear.</span>`); + slave.devotion -= 5; + slave.trust -= 5; + } } } + slave.vagina += 1; + } else { + r.push(`${His} cavernous pussy accommodates the huge dildo ${he}'s required to wear.`); } - slave.vagina += 1; - } else { - r.push(`${His} cavernous pussy accommodates the huge dildo ${he}'s required to wear.`); - } - } else if (slave.vaginalAccessory === "long, huge dildo") { - if (slave.vagina < 4) { - if (slave.fuckdoll === 0) { - if (slave.fetish !== "mindbroken") { - if (slave.sexualQuirk === "size queen") { - r.push(`${He} thinks of the massive dildo stretching out ${his} womanhood and stomach as <span class="lime">preparation for the biggest cocks,</span> and <span class="hotpink">looks forward</span> to take anything — dicks, hands, arms, truly anything — inside ${his} newly capacious cunt.`); - slave.devotion += 4; - } else if (slave.fetish === "masochist" && slave.fetishKnown === 1 && slave.fetishStrength > 60) { - r.push(`${He} gets off on the agony of having ${his} cunt <span class="lime">permanently stretched</span> and ${his} cervix penetrated by a huge dildo. The terrible combination of pain and pleasure <span class="hotpink">breaks ${his} will</span> but fills ${him} with <span class="gold">fear.</span>`); - slave.devotion += 5; - slave.trust -= 5; - } else if (slave.fetish === "submissive" && slave.fetishKnown === 1 && slave.fetishStrength > 60) { - r.push(`${He} submits to the agony of having ${his} cunt <span class="lime">permanently stretched</span> and ${his} cervix penetrated by a huge dildo. Having ${his} hole and cervix ruined at your whim <span class="hotpink">breaks ${his} will</span> but fills ${him} with <span class="gold">fear.</span>`); - slave.devotion += 5; - slave.trust -= 5; - } else { - r.push(`The agony of having ${his} cunt <span class="lime">permanently stretched</span> and ${his} cervix penetrated by a huge dildo fills ${him} with <span class="mediumorchid">resentment</span> and <span class="gold">fear.</span>`); - slave.devotion -= 5; - slave.trust -= 5; + } else { + if (slave.vagina < 4) { + if (slave.fuckdoll === 0) { + if (slave.fetish !== "mindbroken") { + if (slave.sexualQuirk === "size queen") { + r.push(`${He} thinks of the massive dildo stretching out ${his} womanhood and stomach as <span class="lime">preparation for the biggest cocks,</span> and <span class="hotpink">looks forward</span> to take anything — dicks, hands, arms, truly anything — inside ${his} newly capacious cunt.`); + slave.devotion += 4; + } else if (slave.fetish === "masochist" && slave.fetishKnown === 1 && slave.fetishStrength > 60) { + r.push(`${He} gets off on the agony of having ${his} cunt <span class="lime">permanently stretched</span> and ${his} cervix penetrated by a huge dildo. The terrible combination of pain and pleasure <span class="hotpink">breaks ${his} will</span> but fills ${him} with <span class="gold">fear.</span>`); + slave.devotion += 5; + slave.trust -= 5; + } else if (slave.fetish === "submissive" && slave.fetishKnown === 1 && slave.fetishStrength > 60) { + r.push(`${He} submits to the agony of having ${his} cunt <span class="lime">permanently stretched</span> and ${his} cervix penetrated by a huge dildo. Having ${his} hole and cervix ruined at your whim <span class="hotpink">breaks ${his} will</span> but fills ${him} with <span class="gold">fear.</span>`); + slave.devotion += 5; + slave.trust -= 5; + } else { + r.push(`The agony of having ${his} cunt <span class="lime">permanently stretched</span> and ${his} cervix penetrated by a huge dildo fills ${him} with <span class="mediumorchid">resentment</span> and <span class="gold">fear.</span>`); + slave.devotion -= 5; + slave.trust -= 5; + } } } + slave.vagina += 1; + } else { + r.push(`${His} cavernous pussy accommodates the huge dildo ${he}'s required to wear.`); } - slave.vagina += 1; - } else { - r.push(`${His} cavernous pussy accommodates the huge dildo ${he}'s required to wear.`); } } - if (slave.vaginalAccessory === "long, huge dildo" || slave.vaginalAccessory === "long, large dildo" || slave.vaginalAccessory === "long dildo") { + if (dildo.length > 1) { if ((slave.preg > slave.pregData.normalBirth / 10) && slave.pregKnown === 1) { if (jsRandom(1, 100) > 50) { r.push(`The dildo penetrating ${his} womb <span class="orange">caused ${him} to miscarry,</span> which <span class="health dec">damages ${his} health.</span>`); diff --git a/src/endWeek/saLongTermPhysicalEffects.js b/src/endWeek/saLongTermPhysicalEffects.js index b900d14cad38a796c175906622d970b80024d41e..c5238e801b77a78108b47354d897f669db6b1a41 100644 --- a/src/endWeek/saLongTermPhysicalEffects.js +++ b/src/endWeek/saLongTermPhysicalEffects.js @@ -233,7 +233,7 @@ App.SlaveAssignment.longTermPhysicalEffects = (function() { if (slave.assignment !== "serve in the master suite" || V.masterSuiteUpgradeLuxury < 2) { if (slave.assignment !== "work in the dairy" || V.dairyStimulatorsSetting === 0) { if (slave.geneMods.rapidCellGrowth !== 1) { - if (slave.vagina >= 3 && !["huge dildo", "large dildo", "long, huge dildo", "long, large dildo"].includes(slave.vaginalAccessory)) { + if (slave.vagina >= 3 && dildoWidth(slave) < 2) { r.push(`With a rest from strenuous use, <span class="improvement">${his} loose vagina recovers a little.</span>`); slave.vagina -= 1; } else if (slave.anus >= 3 && plugWidth(slave) < 2) { diff --git a/src/endWeek/saSmartPiercingEffects.js b/src/endWeek/saSmartPiercingEffects.js index 7b13bbba49b4293714d45b25fa80c3eee48c523c..56bdc815258f98808601d286cc9bf1c209807011 100644 --- a/src/endWeek/saSmartPiercingEffects.js +++ b/src/endWeek/saSmartPiercingEffects.js @@ -409,7 +409,7 @@ App.SlaveAssignment.SmartPiercing.sadist = class extends App.SlaveAssignment.Sma App.SlaveAssignment.saSmartPiercingEffects = function(slave) { const {he, his, His, him} = getPronouns(slave); const hasBV = slave.vaginalAccessory === "bullet vibrator" || slave.dickAccessory === "bullet vibrator"; - const hasSmartBV = slave.vaginalAccessory === "smart bullet vibrator" || slave.dickAccessory === "smart bullet vibrator"; + const hasSmartBV = dildoVibeLevel(slave) > 1 || slave.dickAccessory === "smart bullet vibrator"; const hasDildoVibe = slave.vaginalAttachment === "vibrator"; const hasSmartDildoVibe = slave.vaginalAttachment === "smart vibrator"; const hasSP = slave.clitPiercing === 3; diff --git a/src/facilities/bodyModification/bodyModification.js b/src/facilities/bodyModification/bodyModification.js index 93e3be757f1c1fa864bbd37018aa0e28c5c1aa97..83bc6d6ba04e82f98d82fa0e8377ae41017f7c98 100644 --- a/src/facilities/bodyModification/bodyModification.js +++ b/src/facilities/bodyModification/bodyModification.js @@ -362,11 +362,11 @@ App.UI.bodyModification = function(slave, cheat = false) { // DESCRIPTIONS App.UI.DOM.appendNewElement("h2", el, "Tattoos"); - for (const name of tattooLocations.keys()) { - if (name === "leg") { - r.push(App.UI.DOM.makeElement("div", App.Desc.tattoo(slave, "thigh"))); - } else { - r.push(App.UI.DOM.makeElement("div", App.Desc.tattoo(slave, name))); + for (let name of tattooLocations.keys()) { + name = (name === "leg") ? "thigh" : name; // Leg/thigh is a weird naming exception for now. + const desc = App.Desc.tattoo(slave, name); + if (desc) { + r.push(App.UI.DOM.makeElement("div", desc)); } } if (r.length === 0) { diff --git a/src/facilities/farmyard/farmyard.js b/src/facilities/farmyard/farmyard.js index 0c51e6a6676479a35766a14cca9694772af441b2..fcbb9365ac2a8d298cf19e81c7b6ba2542515dcf 100644 --- a/src/facilities/farmyard/farmyard.js +++ b/src/facilities/farmyard/farmyard.js @@ -13,7 +13,14 @@ App.Facilities.Farmyard.farmyard = function() { V.returnTo = "Farmyard"; V.encyclopedia = "Farmyard"; - frag.append(intro(), expand(), menials()); + frag.append( + intro(), + expand(), + menials(), + rules(), + upgrades(), + animals() + ); App.UI.DOM.appendNewElement("div", frag, App.UI.SlaveList.stdFacilityPage(App.Entity.facilities.farmyard), "farmyard-slaves"); diff --git a/src/facilities/salon/salonPassage.js b/src/facilities/salon/salonPassage.js index f2e6f5189f9286600a5fc64a0837c81f514619dd..31ba8037f5b6ca460feb03dd4b0b9c18216860c0 100644 --- a/src/facilities/salon/salonPassage.js +++ b/src/facilities/salon/salonPassage.js @@ -128,6 +128,7 @@ App.UI.salon = function(slave, cheat = false) { const options = new App.UI.OptionsGroup(); options.addOption(App.Desc.makeup(slave), "makeup", slave) + .addValue("Makeup free", 0) .addValue("Nice", 1, billMod) .addValue("Gorgeous", 2, billMod) .addValue("Slutty", 4, billMod) @@ -159,11 +160,11 @@ App.UI.salon = function(slave, cheat = false) { .addValue("Very long and garish", 4, billMod) .addValue("Color-coordinate with hair", 2, billMod); - options.addOption("", "makeup", slave) + options.addOption("", "nails", slave) .addValue("Neon", 6, billMod) .addValue("Neon, color-coordinate with hair", 7, billMod); - options.addOption("", "makeup", slave) + options.addOption("", "nails", slave) .addValue("Metallic", 8, billMod) .addValue("Metallic, color-coordinate with hair", 9, billMod); diff --git a/src/facilities/statistics.js b/src/facilities/statistics.js index 380e5499cf6ce95d5624ade61565755554b1ed56..4d0af165db08327df3725360cc19bccfede5d8cd 100644 --- a/src/facilities/statistics.js +++ b/src/facilities/statistics.js @@ -6,7 +6,7 @@ App.Facilities.StatsHelper = class { makeStatsTable(columns) { const table = document.createElement("table"); table.border = "1"; - table.className = "stats"; + table.className = "facility-stats"; const header = App.UI.DOM.appendNewElement("tr", table, "", "header"); App.UI.DOM.appendNewElement("th", header, "Items"); // first column, flexible width App.UI.DOM.appendNewElement("th", header, columns[0], "wide"); // "revenue" column, wider @@ -155,7 +155,7 @@ App.Facilities.StatsHelper = class { row.appendChild(bigCell); const table = document.createElement("table"); - table.className = "stats-slave"; + table.className = "facility-stats-slave"; const header = App.UI.DOM.appendNewElement("tr", table, "", "header"); App.UI.DOM.appendNewElement("th", header, columns[0]); // first column, flexible width App.UI.DOM.appendNewElement("th", header, columns[1], "narrow"); // facility-specific output details diff --git a/src/facilities/toyShop/toyShop.js b/src/facilities/toyShop/toyShop.js new file mode 100644 index 0000000000000000000000000000000000000000..84ac5b700889cf72295d9af2100f280f12df2f16 --- /dev/null +++ b/src/facilities/toyShop/toyShop.js @@ -0,0 +1,241 @@ +/** + * UI for the Body Modification system/studio. Refreshes without refreshing the passage. + */ +App.UI.toyShop = function() { + const container = document.createElement("span"); + let buttPlugName; + let buttPlugData; + let selectedPlug; + init(); + + container.append(createPage()); + return container; + + function createPage() { + const el = new DocumentFragment(); + el.append(intro()); + el.append(buttPlugs()); + return el; + } + + function init() { + buttPlugName = ""; + buttPlugData = { + name: "", + width: 1, + length: 1 + }; + } + + function intro() { + const el = new DocumentFragment(); + App.UI.DOM.appendNewElement("h1", el, "Toy Shop"); + App.UI.DOM.appendNewElement("div", el, `The room is filled with the smell of rubber, latex, and various synthetic materials and solvents. A series of screens allows you to design toys of various shapes and sizes, and then produce them at scale. A bin of defects sits in the corner, glistening a bit under a layer of lubrication.`, "scene-intro"); + return el; + } + + + function buttPlugs() { + const el = new DocumentFragment(); + let linkArray; + App.UI.DOM.appendNewElement("h2", el, "Buttplugs"); + const select = App.UI.DOM.appendNewElement("div", el, App.UI.DOM.link("Start a new design", () => { + init(); + refresh(); + })); + if (V.customItem.buttPlugs.size > 0) { + select.append(selectDesign()); + } + el.append(create()); + return el; + + function create() { + const el = new DocumentFragment(); + const existingDesign = V.customItem.buttPlugs.get(buttPlugName); + if (existingDesign) { + el.append(descLocked()); + } else { + el.append(desc()); + } + if (buttPlugData.name) { + el.append(title()); + } + el.append( + width(), + length(), + ); + + if (existingDesign) { + const build = App.UI.DOM.appendNewElement("div", el, `Send updated design to production and make sure all appropriate slaves are updated `); + const linkArray = []; + linkArray.push( + App.UI.DOM.link( + "Update the mold", + () => { buildPlug(); } + ) + ); + + linkArray.push( + App.UI.DOM.link( + `Recall "${buttPlugName}"`, + () => { deletePlug(); } + ) + ); + build.append(App.UI.DOM.generateLinksStrip(linkArray)); + } else if (buttPlugName && buttPlugData.name){ + el.append(apply()); + } + + return el; + + function descLocked() { + return App.UI.DOM.makeElement("div", `Description has already been selected for this model: "${buttPlugName}"`); + } + } + function selectDesign() { + const el = new DocumentFragment(); + const choice = App.UI.DOM.appendNewElement("span", el, ` or choose an existing design to edit `); + const select = App.UI.DOM.appendNewElement("select", choice); + let matchFound = false; + for (const [key, values] of V.customItem.buttPlugs) { + const option = App.UI.DOM.appendNewElement("option", select, values.name); + option.value = key; + if (option.value === buttPlugName) { + option.selected = true; + matchFound = true; + } + } + if (!matchFound) { + select.selectedIndex = -1; + } + select.onchange = () => { + const O = select.options[select.selectedIndex]; + selectedPlug = O.value; + buttPlugName = selectedPlug; + buttPlugData = V.customItem.buttPlugs.get(selectedPlug); + refresh(); + }; + return el; + } + + function desc() { + const value = App.UI.DOM.makeElement("div", `Enter shape here as it will appear in descriptions `); + value.append(App.UI.DOM.makeTextBox( + buttPlugName, + v => { + buttPlugName = v; + buttPlugData.name = capFirstChar(v); + refresh(); + } + )); + App.UI.DOM.appendNewElement("span", value, ` Your slave has a standard ${buttPlugName ? buttPlugName : `spade-shaped plug`} wedged firmly in their asshole.`, "note"); + return value; + } + + function title() { + const title = App.UI.DOM.makeElement("div", `Enter title as it will appear in lists of choices `); + title.append(App.UI.DOM.makeTextBox( + buttPlugData.name, + v => { + buttPlugData.name = capFirstChar(v); + refresh(); + } + )); + return title; + } + + function width() { + const widthOptions = new Map([ + ["standard", 1], + ["large", 2], + ["huge", 3], + ]); + const width = App.UI.DOM.makeElement("div", `Select width `); + linkArray = []; + for (const [key, value] of widthOptions) { + if (buttPlugData.width === value) { + linkArray.push( + App.UI.DOM.disabledLink( + key, + ["Currently selected"] + ) + ); + } else { + linkArray.push( + App.UI.DOM.link( + key, + () => { + buttPlugData.width = value; + refresh(); + } + ) + ); + } + } + width.append(App.UI.DOM.generateLinksStrip(linkArray)); + return width; + } + + function length() { + const lengthOptions = new Map([ + ["standard", 1], + ["long", 2], + ]); + const length = App.UI.DOM.makeElement("div", `Select length `); + linkArray = []; + for (const [key, value] of lengthOptions) { + if (buttPlugData.length === value) { + linkArray.push( + App.UI.DOM.disabledLink( + key, + ["Currently selected"] + ) + ); + } else { + linkArray.push( + App.UI.DOM.link( + key, + () => { + buttPlugData.length = value; + refresh(); + } + ) + ); + } + } + length.append(App.UI.DOM.generateLinksStrip(linkArray)); + return length; + } + + function buildPlug() { + V.customItem.buttPlugs.set(buttPlugName, buttPlugData); + init(); + refresh(); + } + + function apply() { + const build = App.UI.DOM.appendNewElement("div", el, `Send design to production and make available for all slaves `); + build.append( + App.UI.DOM.link( + "Start the mold", + () => { buildPlug(); } + ) + ); + return build; + } + + function deletePlug() { + V.customItem.buttPlugs.delete(buttPlugName); + for (const slave of V.slaves) { + if (slave.buttplug === buttPlugName) { + slave.buttplug = "none"; + } + } + refresh(); + } + } + + function refresh() { + jQuery(container).empty().append(createPage()); + } +}; diff --git a/src/gui/css/mainStyleSheet.css b/src/gui/css/mainStyleSheet.css deleted file mode 100644 index 7c5b01938e6b32475f8084c2c965795994bbe61f..0000000000000000000000000000000000000000 --- a/src/gui/css/mainStyleSheet.css +++ /dev/null @@ -1,419 +0,0 @@ -body { - overflow-x: hidden; -} - -/* makes HR colorflip compatible */ -hr { - background:#ccc; - border:0; -} - -/* clears SugarCube's default transition */ -.passage { - transition: none; - -webkit-transition: none; -} - -.passage-in { - opacity: 1 !important; -} - -/* default is 54em */ -#passages { - max-width: 100%; -} - -/* small trick to hide broken images */ -img { - text-indent: -10000px; -} - -.imageColumn { /* TODO: this is mostly a copy of imageRef to get its flex features working properly. They can probably be removed from imageRef at some point */ - display: flex; - flex-direction: column; - flex-wrap: wrap; - align-items: flex-start; - position: relative; - float: right; -} - -.imageRef { - display: flex; - flex-direction: column; - flex-wrap: wrap; - align-items: flex-start; - position: relative; - background-color: rgba(80, 80, 80, 0.5); - margin: 2px; -} - -.tinyImg { - height: 120px; - width: 120px; - float: left; -} - -.smlImg { - height: 150px; - width: 150px; - float: left; -} - -.smlImg > img, .smlImg > video { - height: auto; -} - -.medImg { - height: 300px; - width: 300px; - float: right; -} - -.medImg > img, .medImg > video { - height: auto; -} - -.lrgRender { - height: 531px; - width: 531px; - margin-right: -50px; - margin-left: -50px; - float: right; - z-index: -1; -} - -.lrgVector { - height: 600px; - width: 600px; - margin-right: -125px; - margin-left: -125px; - float: right; - z-index: -1; -} - -.lrgRender > div.mask { - width: 150px; - height: 100%; - background: linear-gradient(90deg, rgba(17,17,17,1), rgba(17,17,17,0.8) 60%, rgba(17,17,17,0)); - z-index: 1; - /*position: absolute;*/ -} - -.lrgRender > img, .lrgRender > video { - margin-left: -150px; - height: 531px; - width: auto; -} - -.lrgVector > div.mask { - width: 150px; - height: 100%; - background: linear-gradient(90deg, rgba(17,17,17,1), rgba(17,17,17,0.8) 60%, rgba(17,17,17,0)); - z-index: 1; -} - -.lrgVector > img, .lrgVector > video { - margin-left: -150px; - height: 600px; - width: auto; -} - -.lrgVector svg { - width: 336px; -} - -object { - object-fit: scale-down; - position: absolute; - top: 0; - left: 0; -} - -img.paperdoll { - position: absolute; - top: 0; - left: 0; - margin-left: 0; -} - -/* Colors are made as css classes, to allow them to be changed for a light color scheme (for example). */ -/* a version is for this case: <span class="-.."><a>text</a></span> */ -.link, .link a { color: var(--link-color) } /* link color */ -.aquamarine, .aquamarine a, .skill, .skill a { color: aquamarine } -.coral, .coral a, .fetish.loss, .fetish.loss a { color: coral } -.cyan, .cyan a, .hotkey { color: cyan } /* used for aphrodisiac & neighbor arcs */ -.darkgoldenrod, .darkgoldenrod a, .trust.extremely-terrified, .trust.extremely-terrified a { color: darkgoldenrod } -.darkred, .darkred a, .defiant.full, .defiant.full a { color: darkred } -.darkviolet, .darkviolet a, .devotion.hateful, .devotion.hateful a { color: darkviolet } -.deeppink, .deeppink a, .devotion.devoted, .devotion.devoted a { color: deeppink } /* used for devotion once & agent */ -.steelblue, .steelblue a { color: steelblue } -.deepskyblue, .deepskyblue a, .intelligent, .intelligent a { color: deepskyblue } -.dodgerblue, .dodgerblue a { color: dodgerblue } -.blue, .blue a { color: blue } -.gold, .gold a, .trust.dec, .trust.dec a, .trust.frightened, .trust.frightened a { color: gold } -.goldenrod, .goldenrod a, .trust.terrified, .trust.terrified a { color: goldenrod } -.gray, .gray a { color: gray } -.green, .green a, .reputation.inc, .reputation.inc a, .improvement, .improvement a, .flaw.break, .flaw.break a, .skill.inc, .skill.inc a, .fuckdoll, .fuckdoll a, .positive, .positive a, .health.inc, .health.inc a { color: green } -.hotpink, .hotpink a, .devotion.inc, .devotion.inc a, .devotion.accept, .devotion.accept a { color: hotpink } -.lawngreen, .lawngreen a { color: lawngreen } -.lightblue, .lightblue a { color: lightblue } -.lightcoral, .lightcoral a, .fetish.gain, .fetish.gain a { color: lightcoral } /* compare pink for fetish */ -.lightgreen, .lightgreen a, .relationship, .relationship a, .rivalry.dec, .rivalry.dec a { color: lightgreen } -.lightpink, .lightpink a { color: lightpink } -.lightsalmon, .lightsalmon a, .fetish.inc, .fetish.inc a, .rivalry.inc, .rivalry.inc a, .relationship.dec, .relationship.dec a { color: lightsalmon } -.lime, .lime a, .change.positive, .change.positive a, .virginity.loss, .virginity.loss a, .puberty, .puberty a, .pregnant, .pregnant a { color: lime } /* tight orifices, breast changes, take virginity, not sure on good aliases */ -.limegreen, .limegreen a { color: limegreen } /* multiple questionable uses */ -.magenta, .magenta a, .devotion.worship, .devotion.worship a { color: magenta } -.mediumaquamarine, .mediumaquamarine a, .trust.inc, .trust.inc a, .trust.careful, .trust.careful a { color: mediumaquamarine } -.mediumorchid, .mediumorchid a, .devotion.dec, .devotion.dec a, .devotion.resistant, .devotion.resistant a { color: mediumorchid } -.mediumseagreen, .mediumseagreen a, .trust.trusting, .trust.trusting a { color: mediumseagreen } -.orange, .orange a, .stupid, .stupid a, .change.negative, .change.negative a, .defiant.careful, .defiant.careful a, .ncs, .ncs a, .miscarriage, .miscarriage a, .intro.question { color: orange } /* generally between red and green, and a lot of other places */ -.orangered, .orangered a, .defiant.inc, .defiant.inc a, .defiant.bold, .defiant.bold, .education.neg a { color: orangered } -.orchid, .orchid a { color: orchid } /* used once (wrong? */ -.pink, .pink a, .slave.name.simple { color: pink } /* also fetish start ??? , and a lot of other stuff */ -.red, .red a, .health.dec, .health.dec a, .cash.dec, .cash.dec a, .stat.drop, .stat.drop a, .flaw.gain, .flaw.gain a, .mindbreak, .mindbreak a, .error, .error a, .elites.loss, .elites.loss a, .reputation.dec, .reputation.dec a, .warning, .warning a { color: red } /* also generally bad stuff */ -/* note: .error is for unexpected behavior, .warning for player feedback */ -.seagreen, .seagreen a, .trust.prof-trusting, .trust.prof-trusting a { color: seagreen } -.springgreen, .springgreen a, .skill.player, .skill.player a { color: springgreen } -.tan, .tan a { color: tan } /* some ethnicity */ -.chocolate, .chocolate a { color: chocolate } -.saddlebrown, .saddlebrown a { color: saddlebrown } -.teal, .teal a { color: teal } -.yellow, .yellow a, .noteworthy, .noteworthy a, .paraphilia.gain, .paraphilia.gain a, .devotion.ambivalent, .devotion.ambivalent a, .trust.fearful, .trust.fearful a, .job.change { color: yellow } -.yellowgreen, .yellowgreen a, .cash.inc, .cash.inc a, .cash, .cash a { color: yellowgreen } -.white a { color: white } -.violet, .libido.inc { color: violet } -.khaki, .libido.dec { color: khaki } - -/*! <<checkvars>> macro for SugarCube 2.x */ -#ui-dialog-body.checkvars{padding:1em}#ui-dialog-body.checkvars h1{font-size:1em;margin-top:0}#ui-dialog-body.checkvars table{border-collapse:collapse;border-spacing:0}#ui-dialog-body.checkvars thead tr{border-bottom:2px solid #444}#ui-dialog-body.checkvars tr:not(:first-child){border-top:1px solid #444}#ui-dialog-body.checkvars td,#ui-dialog-body.checkvars th{padding:.25em 1em}#ui-dialog-body.checkvars td:first-child,#ui-dialog-body.checkvars th:first-child{padding-left:.5em;border-right:1px solid #444}#ui-dialog-body.checkvars td:last-child,#ui-dialog-body.checkvars th:last-child{padding-right:.5em}#ui-dialog-body.checkvars th:first-child{text-align:center}#ui-dialog-body.checkvars td:first-child{font-weight:700;text-align:right}#ui-dialog-body.checkvars td{font-family:monospace,monospace;vertical-align:top;white-space:pre-wrap}#ui-dialog-body.checkvars .scroll-pad{margin:0;padding:0} - -div.output{ -width: 100%; -width: 100vw; -max-width: 100%; -word-break: break-all; -white-space: normal; -} -/* css rules for rules assistant */ -.rajs-list-item { - display: inline-block; - color: var(--link-color); - margin-right: 1em; -} -.rajs-list-item.selected { - color: gray; - text-decoration: none; -} -.rajs-list-item:last-of-type { margin-right: 0; } -.rajs-list-item:hover { - cursor: pointer; - text-decoration: underline; -} -.rajs-list-item.selected:hover { - cursor: default; - text-decoration: none; -} -.rajs-list strong:first-of-type, .rajs-list input { - margin-right: 2em; -} -.rajs-list-item input { - margin: 0.25em; -} -.rajs-section h1 { - border-bottom: 1px solid white; - cursor: pointer; -} -.rajs-section h1:hover { text-decoration: underline; } - -.scroll { - overflow: auto; -} - -h1, h2, h3 { - margin-bottom: 0; - margin-top: 0.25em; -} -.founding { - font-size: 0.8em; - margin-top: -0.8em; - margin-left: 0.5em; - font-style: italic; -} -table.corporate { - border: 3px darkgreen double; - border-collapse: collapse; - min-width: 33%; -} -table.corporate tbody tr:nth-child(even) { - background-color: rgb(0, 30, 0); -} -table.corporate tbody tr:nth-child(odd) { - background-color: rgb(15, 40, 15); -} -table.corporate td { - vertical-align: top; -} -table.corporate tbody th, table.corporate thead th { - background-color: black; - font-weight: bold; -} -.minor-note { - font-size: 0.75em; - font-style: italic; -} -.majorText { - margin-top: 0.5em; - margin-bottom: 1.5em; -} -.tab { - margin-left: 2em; -} -div.slave-report { - margin-top: 1em; - margin-bottom: 1em; -} -div.indent, p.indent { - text-indent: 2em; -} -div.double-indent, p.double-indent { - text-indent: 4em; -} -div.choices, p.choices { - margin-left: 2em; -} -div.double-choices, p.double-choices { - margin-left: 4em; -} - -/* setting at the beginning of a scene / subscene */ -.scene-intro { - font-style: italic; -} - -/* adds detail to an option: Do something. <span class="detail">Sentence that explains the effect/conditions */ -.detail { - font-style: italic; -} - -/* additional information not related to a specific option */ -.note { - font-style: italic; -} - -.story-label, .regularParties, .underline { - text-decoration: underline; -} - -/* Note: Do not do a linebreak after span in HTML, because it will underline the automatic space it inserts: "Matilda_is a cow" */ -.slave-name { - color: pink; - font-weight: bold; - text-decoration: underline; - text-decoration-color: white; -} - -.name { - font-weight: bold; -} - -.custom-label { - color: yellow; - font-weight: bold; -} - -div.cheat-menu { - font-style: italic; - position: absolute; - right: 50px; -} - -h1 + p { - margin-top: 0; -} -h2 + p { - margin-top: 0; -} -h3 + p { - margin-top: 0; -} - -.main-fcnn { - text-align: center; - margin: 0 auto; -} - -.major-link, .bold { - font-weight: bold; -} - -.clear-formatting { - color: white; - font-weight: normal; - font-style: normal; -} - -.major-warning { - font-weight: bold; - color: red; -} - -div.center, p.center { - margin-left: auto; - margin-right: auto; - text-align: center; -} - -div.flex-container { - display: flex; -} - -/* TODO unify tooltip systems */ -.hasTooltip { - text-decoration: underline; -} - -/* interactable tooltip-like container - created/destroyed dynamically */ -.details-overlay { - display: inline-block; - font-size: smaller; - width: max-content; - height: max-content; - border-style: solid; - border-color: slategray; - border-width: 2px; - border-radius: 3px; - background-color: rgb(17, 17, 17); - padding: 3px; - position: absolute; - z-index: 2; - text-indent: 0; -} - -/* make cheat textboxes fit in sidebar */ -#story-caption input { - min-width: 0; - width: calc(100% - 0.8em - 2px); -} - -/* slave interact navigation */ -.adjacent-slave { - font-weight: bold; -} -.interact-name { - margin: 0 2em; -} - -.icons { - font-family: 'tme-fa-icons'; -} - -.favorite, .favorite:hover { - color: yellow; - text-decoration: none; -} - -.not-favorite, .not-favorite:hover { - color: grey; - text-decoration: none; -} diff --git a/src/gui/css/wardrobeUse.css b/src/gui/css/wardrobeUse.css deleted file mode 100644 index 94a110b434caf8680e6b94b7d7fb28987dc18ea3..0000000000000000000000000000000000000000 --- a/src/gui/css/wardrobeUse.css +++ /dev/null @@ -1,24 +0,0 @@ -/* Style sheet for WardrobeUse.tw */ - -#passage-wardrobe-use .optionMacro { - display: inline; -} - -#passage-wardrobe-use .optionDescription { - width: unset; - text-align: left; -} - -#passage-wardrobe-use .optionValue { - display: flex; -} - -#passage-wardrobe-use .optionMacroOption { - flex-grow: 1; -} - -/* Last line shouldn't grow */ -#passage-wardrobe-use .optionValue::after { - flex-grow: 1000000000; - content: ''; -} diff --git a/src/gui/quicklinks.js b/src/gui/quicklinks.js index c7a5dbb9347e69d586d7466daa550ebb0a43e461..f993e46a2038ab8f40f373312f0e156ea1212795 100644 --- a/src/gui/quicklinks.js +++ b/src/gui/quicklinks.js @@ -65,6 +65,7 @@ App.UI.quickMenu = (function() { "Implant Manufactory": true, "Prosthetic Lab": true, "Wardrobe": true, + "Toy Shop": true, "The Black Market": true, }, Tools: { @@ -96,6 +97,7 @@ App.UI.quickMenu = (function() { "Firebase": () => !V.SF.Toggle || V.SF.Toggle < 1 || V.SF.Active < 1, "Future Society": () => !V.FSAnnounced, "Gene Lab": () => !V.geneticMappingUpgrade, + "Toy Shop": () => !V.toyShop, "Head Girl Suite": () => !V.HGSuite, "Implant Manufactory": () => !V.ImplantProductionUpgrade, "Incubator": () => !V.incubator, diff --git a/src/interaction/main/walkPast.js b/src/interaction/main/walkPast.js index 516e06e3e8e2d7ac1e6af9de0ef477bf78c4d90e..4e7e2a8267e464aa028447e84de82fe004130a71 100644 --- a/src/interaction/main/walkPast.js +++ b/src/interaction/main/walkPast.js @@ -8374,7 +8374,7 @@ globalThis.walkPast = (function() { t += `You get a good view of ${his} pussy.`; } } - if ((slave.vaginalAccessory === "long dildo") || (slave.vaginalAccessory === "long, large dildo") || (slave.vaginalAccessory === "long, huge dildo")) { + if (dildoLength(slave) > 1) { t += `With every motion ${he} makes, ${his} dildo shifts, bulging out ${his} stomach.`; if (plugLength(slave) > 1) { t += `Beside it, a second bulge caused by ${his} extra long buttplug.`; @@ -8964,7 +8964,7 @@ globalThis.walkPast = (function() { t += `You get a good view of ${his} pussy.`; } } - if ((slave.vaginalAccessory === "long dildo") || (slave.vaginalAccessory === "long, large dildo") || (slave.vaginalAccessory === "long, huge dildo")) { + if (dildoLength(slave) > 1) { t += `With every motion ${he} makes, ${his} dildo shifts, bulging out ${his} stomach.`; if (plugLength(slave) > 1) { t += `Beside it, a second bulge caused by ${his} extra long buttplug.`; diff --git a/src/interaction/prostheticConfig.tw b/src/interaction/prostheticConfig.tw index 4326995e2739557b650eb27dddce73f1203e6b58..d6dade1c2a87e361ba903f195ec5e179568523c1 100644 --- a/src/interaction/prostheticConfig.tw +++ b/src/interaction/prostheticConfig.tw @@ -32,7 +32,7 @@ This room is lined with shelves and cabinets; it could be easily mistaken for a <<if hasAnyCyberneticEyes(getSlave($AS))>> <h2>Eyes</h2> - <p class="tab"> /* tab works better with links */ + <p class="choices"> /* tab works better with links */ $He has <<if hasBothCyberneticEyes(getSlave($AS))>> ocular implants <<else>> an ocular implant <</if>> installed. You can change <<if hasBothCyberneticEyes(getSlave($AS))>>their<<else>>its<</if>> settings: <div class="eyeContainer"> diff --git a/src/interaction/siRules.js b/src/interaction/siRules.js index b5e02a194109390fe129440b443977390d131e8e..2d96e64db46a466810f4c76f21e32b5591372196 100644 --- a/src/interaction/siRules.js +++ b/src/interaction/siRules.js @@ -374,7 +374,7 @@ App.UI.SlaveInteract.rules = function(slave) { function smartSettings(slave) { let el = document.createElement('div'); - const smartBulletVibe = slave.vaginalAccessory === "smart bullet vibrator" || slave.dickAccessory === "smart bullet vibrator"; + const smartBulletVibe = dildoVibeLevel(slave) > 1 || slave.dickAccessory === "smart bullet vibrator"; const smartDildoVibe = slave.vaginalAttachment === "smart vibrator"; if (slave.clitPiercing === 3 || smartBulletVibe || smartDildoVibe) { diff --git a/src/interaction/siWardrobe.js b/src/interaction/siWardrobe.js index cc7345285c07d56ef67ef9217efd26af95ba47d0..ec4100d6ad67a39bf43c266666f08bcf6309dde7 100644 --- a/src/interaction/siWardrobe.js +++ b/src/interaction/siWardrobe.js @@ -520,6 +520,19 @@ App.UI.SlaveInteract.wardrobe = function(slave) { App.UI.DOM.appendNewElement("div", el, generateRows(normalArray, "buttplug", true), "choices"); App.UI.DOM.appendNewElement("div", el, generateRows(longArray, "buttplug", true), "choices"); + if (V.customItem.buttPlugs.size > 0) { + let customArray = []; + for (const [key, object] of V.customItem.buttPlugs) { + const reshapedItem = { + text: object.name, + updateSlave: {buttplug: key}, + FS: object.fs, + }; + customArray.push(reshapedItem); + } + App.UI.DOM.appendNewElement("div", el, generateRows(customArray, "buttplug", false), "choices"); + } + return el; } @@ -589,9 +602,11 @@ App.UI.SlaveInteract.wardrobe = function(slave) { } el.appendChild(label); - let optionsArray = []; + let bulletArray = []; + let normalArray = []; + let longArray = []; - for (const [key, object] of App.Data.slaveWear.vaginalAccessories) { + for (const [key, object] of App.Data.vaginalAccessories) { if (key === "none") { // skip none in set, we set the link elsewhere. continue; @@ -601,24 +616,29 @@ App.UI.SlaveInteract.wardrobe = function(slave) { updateSlave: {vaginalAccessory: key}, FS: object.fs, }; - optionsArray.push(reshapedItem); + if (object.width === 0) { + bulletArray.push(reshapedItem); + } else if (object.length > 1) { + longArray.push(reshapedItem); + } else { + normalArray.push(reshapedItem); + } } // Sort // No sort here since we want small -> large. optionsArray = optionsArray.sort((a, b) => (a.text > b.text) ? 1 : -1); // Options - let links = document.createElement('div'); - links.className = "choices"; - links.appendChild(generateRows(optionsArray, "vaginalAccessory", true)); - el.appendChild(links); + App.UI.DOM.appendNewElement("div", el, generateRows(bulletArray, "vaginalAccessory", true), "choices"); + App.UI.DOM.appendNewElement("div", el, generateRows(normalArray, "vaginalAccessory", true), "choices"); + App.UI.DOM.appendNewElement("div", el, generateRows(longArray, "vaginalAccessory", true), "choices"); return el; } function vaginalAttachment() { let el = document.createElement('div'); - if (["none", "bullet vibrator", "smart bullet vibrator"].includes(slave.vaginalAccessory)) { + if (dildoWidth(slave) === 0) { return el; } @@ -645,7 +665,7 @@ App.UI.SlaveInteract.wardrobe = function(slave) { } const reshapedItem = { text: object.name, - updateSlave: {vaginalAttachments: key}, + updateSlave: {vaginalAttachment: key}, FS: object.fs, }; optionsArray.push(reshapedItem); @@ -757,7 +777,7 @@ App.UI.SlaveInteract.wardrobe = function(slave) { let optionsArray = []; - for (const [key, object] of App.Data.slaveWear.chastityDevices) { + for (const [key, object] of App.Data.chastityDevices) { if (key === "none") { // skip none in set, we set the link elsewhere. continue; diff --git a/src/js/itemAvailability.js b/src/js/itemAvailability.js index ada89536918edb9a648dc4b203036f1292ec4ec0..1a70b09f052bc9cbde194c99b878d0eb70d12841 100644 --- a/src/js/itemAvailability.js +++ b/src/js/itemAvailability.js @@ -34,7 +34,7 @@ globalThis.isItemAccessible = (function() { selectedDB = App.Data.slaveWear.buttplugAttachments; break; case "vaginalAccessory": - selectedDB = App.Data.slaveWear.vaginalAccessories; + selectedDB = App.Data.vaginalAccessories; break; case "vaginalAttachment": selectedDB = App.Data.slaveWear.vaginalAttachments; @@ -46,7 +46,7 @@ globalThis.isItemAccessible = (function() { selectedDB = App.Data.shoes; break; case "chastity": - selectedDB = App.Data.slaveWear.chastityDevices; + selectedDB = App.Data.chastityDevices; break; default: // console.log(`made a category for ${category} automatically, may need to define this by hand`); @@ -224,7 +224,9 @@ globalThis.isItemAccessible = (function() { case "vibrator": if (slave.vaginalAccessory === "none") { return "No vaginal accessory to attach it to"; - } else if (slave.vaginalAccessory === "bullet vibrator" || slave.vaginalAccessory === "smart bullet vibrator") { + } else if (dildoWidth(slave) === 0) { + return "Vaginal accessory is too small"; + } else if (dildoVibeLevel(slave)) { return "Vaginal accessory already vibrates"; } else { return true; diff --git a/src/js/main.js b/src/js/main.js index 750d32686277c38d6865c7cac47a8c4311cb13cf..7999c7603212a83e156bc04d596f575bce22f14d 100644 --- a/src/js/main.js +++ b/src/js/main.js @@ -225,7 +225,7 @@ App.MainView.full = function() { div.append(App.UI.DOM.makeElement("span", "MAIN MENU", "name")); App.UI.DOM.appendNewElement("span", div, App.UI.DOM.passageLink("Summary Options", "Summary Options"), - ["tab", "note"]); + ["choices", "note"]); if (V.rulesAssistantMain !== 0) { div.append(" | "); @@ -349,17 +349,7 @@ App.MainView.full = function() { fragment.append(assemble()); } catch (ex) { - App.UI.DOM.appendNewElement("p", fragment, `${ex.name}: ${ex.message}`, ["bold", "error"]); - - const p = document.createElement("p"); - const lines = ex.stack.split("\n"); - for (const ll of lines) { - const div = document.createElement("div"); - // remove file path from error message - div.append(ll.replace(/file:.*\//, "<path>/")); - p.append(div); - } - fragment.append(p); + fragment.append(App.UI.DOM.formatException(ex)); } return fragment; diff --git a/src/js/rulesAssistantOptions.js b/src/js/rulesAssistantOptions.js index 294b86564f30c9595c969fb68c540dbb72a02da9..23c59b39e43381f354f08f40a589136c55afc656 100644 --- a/src/js/rulesAssistantOptions.js +++ b/src/js/rulesAssistantOptions.js @@ -1928,7 +1928,7 @@ App.RA.options = (function() { class VagAccVirginsList extends ListSelector { constructor() { - super("Vaginal accessories for virgins", isItemAccessible.array(App.Data.slaveWear.vaginalAccessories)); + super("Vaginal accessories for virgins", isItemAccessible.array(App.Data.vaginalAccessories)); this.setValue(current_rule.set.virginAccessory); this.onchange = (value) => current_rule.set.virginAccessory = value; } @@ -1936,7 +1936,7 @@ App.RA.options = (function() { class VagAccAVirginsList extends ListSelector { constructor() { - super("Vaginal accessories for anal virgins", isItemAccessible.array(App.Data.slaveWear.vaginalAccessories)); + super("Vaginal accessories for anal virgins", isItemAccessible.array(App.Data.vaginalAccessories)); this.setValue(current_rule.set.aVirginAccessory); this.onchange = (value) => current_rule.set.aVirginAccessory = value; } @@ -1944,7 +1944,7 @@ App.RA.options = (function() { class VagAccOtherList extends ListSelector { constructor() { - super("Vaginal accessories for other slaves", isItemAccessible.array(App.Data.slaveWear.vaginalAccessories)); + super("Vaginal accessories for other slaves", isItemAccessible.array(App.Data.vaginalAccessories)); this.setValue(current_rule.set.vaginalAccessory); this.onchange = (value) => current_rule.set.vaginalAccessory = value; } diff --git a/src/js/slaveCostJS.js b/src/js/slaveCostJS.js index 98d54d5a1ef59b370acc8d40768f49aade5c63cf..a736300474d519c13b931212395c8c6d950ffa36 100644 --- a/src/js/slaveCostJS.js +++ b/src/js/slaveCostJS.js @@ -213,9 +213,9 @@ globalThis.BeautyArray = (function() { } } else { if (heightPass(slave)) { - adjustBeauty("Height: Statuesque Glorification", ((slave.height + heelLength(slave) - 169) * ((arcology.FSStatuesqueGlorification / 50) + 0.5))); + adjustBeauty("Height: Statuesque Glorification", ((slave.height + shoeHeight(slave) - 169) * ((arcology.FSStatuesqueGlorification / 50) + 0.5))); } else { - adjustBeauty("Height: Statuesque Glorification", -(((arcology.FSStatuesqueGlorification / 10) + (170 - slave.height + heelLength(slave))) * 2)); + adjustBeauty("Height: Statuesque Glorification", -(((arcology.FSStatuesqueGlorification / 10) + (170 - slave.height + shoeHeight(slave))) * 2)); } } } else { diff --git a/src/js/utilsAssessSlave.js b/src/js/utilsAssessSlave.js index 5dfda9f45376541bcf3a49cdc56a67136472f72a..804be4ec9edc2951ae2003b6e1ae607a055a4dc4 100644 --- a/src/js/utilsAssessSlave.js +++ b/src/js/utilsAssessSlave.js @@ -274,7 +274,8 @@ globalThis.shoeHeight = function(slave) { * @returns {0|1|2|3} */ globalThis.plugWidth = function(slave) { - return App.Data.buttplugs.get(slave.buttplug) ? App.Data.buttplugs.get(slave.buttplug).width : 0; + const plug = App.Data.buttplugs.get(slave.buttplug) || V.customItem.buttPlugs.get(slave.buttplug); + return plug.width || 0; }; /** @@ -282,8 +283,37 @@ globalThis.plugWidth = function(slave) { * @returns {0|1|2|3} */ globalThis.plugLength = function(slave) { - return App.Data.buttplugs.get(slave.buttplug) ? App.Data.buttplugs.get(slave.buttplug).length : 0; + const plug = App.Data.buttplugs.get(slave.buttplug) || V.customItem.buttPlugs.get(slave.buttplug); + return plug.length || 0; }; +/** + * @param {App.Entity.SlaveState} slave + * @returns {0|1|2|3} + */ +globalThis.dildoWidth = function(slave) { + const dildo = App.Data.vaginalAccessories.get(slave.vaginalAccessory) || V.customItem.dildos.get(slave.vaginalAccessory); + if (dildo === undefined) { + console.log("missing dildo: ", slave.vaginalAccessory) + return 0 + } + return dildo.width || 0; +}; +/** + * @param {App.Entity.SlaveState} slave + * @returns {0|1|2} + */ +globalThis.dildoLength = function(slave) { + const dildo = App.Data.vaginalAccessories.get(slave.vaginalAccessory) || V.customItem.dildos.get(slave.vaginalAccessory); + return dildo.length || 0; +}; +/** + * @param {App.Entity.SlaveState} slave + * @returns {number} + */ +globalThis.dildoVibeLevel = function(slave) { + const dildo = App.Data.vaginalAccessories.get(slave.vaginalAccessory) || V.customItem.dildos.get(slave.vaginalAccessory); + return dildo.vibrates || 0; +}; diff --git a/src/js/utilsDOM.js b/src/js/utilsDOM.js index a904b1117d55ad28749c8419ac08551872fc53e8..926132a916b73f0c9d95ee497a8225994a06e769 100644 --- a/src/js/utilsDOM.js +++ b/src/js/utilsDOM.js @@ -438,3 +438,65 @@ App.UI.DOM.cashFormat = function(s) { span.textContent = cashFormat(Math.trunc(s)); return span; }; + +/** + * Renders an exception to DOM. + * Tries it's best to not fail itself. + * + * @param {Error } ex Exception + * @param {boolean} recursion set if formatException() called itself, never set from outside + * @returns {DocumentFragment|HTMLParagraphElement} + */ +App.UI.DOM.formatException = function formatException(ex, recursion = false) { + /** + * In case the normal rendering failed attempts to provide some information on it. + * In the worst case gives back a default error message. + * + * @param exception + * @returns {DocumentFragment|HTMLParagraphElement} + */ + function failSafe(exception) { + if (!recursion) { + return formatException(exception, true); + } else { + // Not using custom functions here, as they may be the cause of the error + const p = document.createElement("p"); + p.classList.add("bold", "error"); + p.append("Unrecoverable error in App.UI.DOM.formatException()! Please report this."); + return p; + } + } + + /** + * Renders the exception to DOM + * + * @returns {DocumentFragment} + */ + function render() { + const fragment = document.createDocumentFragment(); + + App.UI.DOM.appendNewElement("p", fragment, `${ex.name}: ${ex.message}; ${Config.saves.version}`, ["bold", "error"]); + + const p = document.createElement("p"); + const lines = ex.stack.split("\n"); + for (const ll of lines) { + const div = document.createElement("div"); + // remove file path from error message + div.append(ll.replace(/file:.*\//, "<path>/")); + p.append(div); + } + fragment.append(p); + + return fragment; + } + + try { + if (!ex) { + // Create a new Error so we have access to a stacktrace. + return failSafe(new Error("No exception provided!")); + } + return render(); + } catch (ex) { + return failSafe(ex); + } +}; diff --git a/src/npc/descriptions/butt/buttplug.js b/src/npc/descriptions/butt/buttplug.js index bf8bfd502dff87d6cd2b0935e35a0b1b88928ed4..eda8f53815e9c790dc38fef555aca17a43de2340 100644 --- a/src/npc/descriptions/butt/buttplug.js +++ b/src/npc/descriptions/butt/buttplug.js @@ -5,7 +5,7 @@ * @param {boolean} [params.eventDescription] * @returns {string} */ -App.Desc.buttplug = function(slave, {market, eventDescription} = {}) { +App.Desc.buttplug = function(slave, { market, eventDescription } = {}) { const r = []; const { he, him, his, He, His @@ -612,73 +612,76 @@ App.Desc.buttplug = function(slave, {market, eventDescription} = {}) { } } } - - switch (slave.buttplug) { - case "plug": - r.push(`It's filled by a standard`); + const buttplug = App.Data.buttplugs.get(slave.buttplug) || V.customItem.buttPlugs.get(slave.buttplug); + if (buttplug.width === 1) { + if (buttplug.length === 1) { + r.push(`It's filled by a standard sized`); if (slave.anus > 2) { - r.push(`buttplug, which is on the verge of falling out.`); + r.push(`${slave.buttplug}, which is on the verge of falling out.`); } else { - r.push(`buttplug.`); - } - if (slave.buttplugAttachment === "tail") { - r.push(`A tail protrudes from the back of the plug and dangles from ${his} rear.`); - } else if (slave.buttplugAttachment === "fox tail") { - r.push(`A bushy ${slave.hColor} tail with a white tip protrudes from the back of the plug and dangles from ${his} rear.`); - } else if (slave.buttplugAttachment === "cow tail") { - r.push(`A slim, spotted tail with a cute tuft at its tip protrudes from the back of the plug and dangles from ${his} rear.`); - } else if (slave.buttplugAttachment === "cat tail") { - r.push(`A tail protrudes from the back of the plug and springs upwards from ${his} rear.`); + r.push(`${slave.buttplug}.`); } - break; - case "long plug": + } else { r.push(`It's filled by a standard sized, overly long`); if (slave.anus > 2) { - r.push(`buttplug, which is on the verge of sliding out ${his} rear.`); + r.push(`${slave.buttplug}, which is on the verge of sliding out ${his} rear.`); } else { - r.push(`buttplug.`); + r.push(`${slave.buttplug}.`); } r.push(`It causes a noticeable bulge in ${his} belly.`); - if (slave.buttplugAttachment === "tail") { - r.push(`A tail protrudes from the back of the plug and dangles from ${his} rear.`); - } else if (slave.buttplugAttachment === "fox tail") { - r.push(`A bushy ${slave.hColor} tail with a white tip protrudes from the back of the plug and dangles from ${his} rear.`); - } else if (slave.buttplugAttachment === "cow tail") { - r.push(`A slim, spotted tail with a cute tuft at its tip protrudes from the back of the plug and dangles from ${his} rear.`); - } else if (slave.buttplugAttachment === "cat tail") { - r.push(`A tail protrudes from the back of the plug and springs upwards from ${his} rear.`); + } + } else if (buttplug.width === 2) { + r.push(`It's`); + if (slave.anus < 2) { + r.push(`agonizingly stretched`); + } else if (slave.anus < 3) { + r.push(`uncomfortably stretched`); + } else { + r.push(`comfortably stretched`); + } + if (buttplug.length === 1) { + r.push(`by a large ${slave.buttplug}.`); + } else { + r.push(`by a large and long ${slave.buttplug}. It causes a noticeable bulge in ${his} belly.`); + } + } else if (buttplug.width === 3) { + if (buttplug.length === 1) { + if (slave.anus < 4) { + r.push(`It's agonizingly stretched by a ${slave.buttplug} so huge ${his} anus is probably being stretched into a permanent gape.`); + } else { + r.push(`Its ridiculous gape is comfortably filled by a huge ${slave.buttplug}.`); } - break; - case "large plug": - r.push(`It's`); - if (slave.anus < 2) { - r.push(`agonizingly stretched`); - } else if (slave.anus < 3) { - r.push(`uncomfortably stretched`); + } else { + if (slave.anus < 4) { + r.push(`It's agonizingly stretched by a ${slave.buttplug} so huge it causes ${his} belly to bulge and is likely stretching ${his} anus into a permanent gape.`); } else { - r.push(`comfortably stretched`); + r.push(`Its ridiculous gape is comfortably filled by a wide and long ${slave.buttplug}. It causes a noticeable bulge in ${his} belly.`); } - r.push(`by a large buttplug.`); + } + if (slave.anus < 4) { + if (slave.fuckdoll === 0) { + if (slave.fetish === "masochist" && slave.fetishKnown === 1 && slave.fetishStrength > 60) { + r.push(`${He}'s frequently in tears from the pain, which is so sharp it often tips ${him} over into spontaneous orgasm.`); + } else { + r.push(`${He} spends much of ${his} time sobbing with anal pain and fear at having ${his} hole ruined.`); + } + } + } + } + + switch (buttplug.width) { + case 3: if (slave.buttplugAttachment === "tail") { - r.push(`${He} swings the tail from side to side with every shift of ${his} rear.`); + r.push(`${He} sways the tail back and forth with every ginger movement of ${his} rear.`); } else if (slave.buttplugAttachment === "fox tail") { - r.push(`${He} swings the bushy ${slave.hColor} tail from side to side with every shift of ${his} rear.`); + r.push(`${He} sways the bushy ${slave.hColor} tail back and forth with every ginger movement of ${his} rear.`); } else if (slave.buttplugAttachment === "cow tail") { - r.push(`${He} swings the spotted tail from side to side with every shift of ${his} rear.`); + r.push(`${He} sways the spotted tail back and forth with every ginger movement of ${his} rear.`); } else if (slave.buttplugAttachment === "cat tail") { - r.push(`${He} bounces the tail from side to side with every shift of ${his} rear.`); + r.push(`${He} jiggles the tail back and forth with every ginger movement of ${his} rear.`); } break; - case "long, large plug": - r.push(`It's`); - if (slave.anus < 2) { - r.push(`agonizingly stretched`); - } else if (slave.anus < 3) { - r.push(`uncomfortably stretched`); - } else { - r.push(`comfortably stretched`); - } - r.push(`by a large and long buttplug. It causes a noticeable bulge in ${his} belly.`); + case 2: if (slave.buttplugAttachment === "tail") { r.push(`${He} swings the tail from side to side with every shift of ${his} rear.`); } else if (slave.buttplugAttachment === "fox tail") { @@ -689,51 +692,17 @@ App.Desc.buttplug = function(slave, {market, eventDescription} = {}) { r.push(`${He} bounces the tail from side to side with every shift of ${his} rear.`); } break; - case "huge plug": - if (slave.anus < 4) { - r.push(`It's agonizingly stretched by a plug so huge ${his} anus is probably being stretched into a permanent gape.`); - if (slave.fuckdoll === 0) { - if (slave.fetish === "masochist" && slave.fetishKnown === 1 && slave.fetishStrength > 60) { - r.push(`${He}'s frequently in tears from the pain, which is so sharp it often tips ${him} over into spontaneous orgasm.`); - } else { - r.push(`${He} spends much of ${his} time sobbing with anal pain and fear at having ${his} hole ruined.`); - } - } - } else { - r.push(`Its ridiculous gape is comfortably filled by a huge buttplug.`); - } - if (slave.buttplugAttachment === "tail") { - r.push(`${He} sways the tail back and forth with every ginger movement of ${his} rear.`); - } else if (slave.buttplugAttachment === "fox tail") { - r.push(`${He} sways the bushy ${slave.hColor} tail back and forth with every ginger movement of ${his} rear.`); - } else if (slave.buttplugAttachment === "cow tail") { - r.push(`${He} sways the spotted tail back and forth with every ginger movement of ${his} rear.`); - } else if (slave.buttplugAttachment === "cat tail") { - r.push(`${He} jiggles the tail back and forth with every ginger movement of ${his} rear.`); - } - break; - case "long, huge plug": - if (slave.anus < 4) { - r.push(`It's agonizingly stretched by a plug so huge it causes ${his} belly to bulge and is likely stretching ${his} anus into a permanent gape.`); - if (slave.fuckdoll === 0) { - if (slave.fetish === "masochist" && slave.fetishKnown === 1 && slave.fetishStrength > 60) { - r.push(`${He}'s frequently in tears from the pain, which is so sharp it often tips ${him} over into spontaneous orgasm.`); - } else { - r.push(`${He} spends much of ${his} time sobbing with anal pain and fear at having ${his} hole ruined.`); - } - } - } else { - r.push(`Its ridiculous gape is comfortably filled by a wide and long buttplug. It causes a noticeable bulge in ${his} belly.`); - } + case 1: if (slave.buttplugAttachment === "tail") { - r.push(`${He} sways the tail back and forth with every ginger movement of ${his} rear.`); + r.push(`A tail protrudes from the back of the plug and dangles from ${his} rear.`); } else if (slave.buttplugAttachment === "fox tail") { - r.push(`${He} sways the bushy ${slave.hColor} tail back and forth with every ginger movement of ${his} rear.`); + r.push(`A bushy ${slave.hColor} tail with a white tip protrudes from the back of the plug and dangles from ${his} rear.`); } else if (slave.buttplugAttachment === "cow tail") { - r.push(`${He} sways the spotted tail back and forth with every ginger movement of ${his} rear.`); + r.push(`A slim, spotted tail with a cute tuft at its tip protrudes from the back of the plug and dangles from ${his} rear.`); } else if (slave.buttplugAttachment === "cat tail") { - r.push(`${He} jiggles the tail back and forth with every ginger movement of ${his} rear.`); + r.push(`A tail protrudes from the back of the plug and springs upwards from ${his} rear.`); } } + return r.join(" "); }; diff --git a/src/npc/descriptions/crotch/vagina.js b/src/npc/descriptions/crotch/vagina.js index 45c1c6ba13156cdaba99775c41e788f00210b149..f2d81c77964d16829ce7ca524ba68e7f055bda4e 100644 --- a/src/npc/descriptions/crotch/vagina.js +++ b/src/npc/descriptions/crotch/vagina.js @@ -249,7 +249,9 @@ App.Desc.vagina = function(slave) { } } } - r.push(App.Desc.vaginalAccessory(slave)); + if (slave.vaginalAccessory !== "none") { + r.push(App.Desc.vaginalAccessory(slave)); + } } if (slave.ovaImplant !== 0) { diff --git a/src/npc/descriptions/crotch/vaginalAccessory.js b/src/npc/descriptions/crotch/vaginalAccessory.js index 847437102c87cd652268f90f032854b154cf3911..948766998f0f5488617774baff953795c8effd19 100644 --- a/src/npc/descriptions/crotch/vaginalAccessory.js +++ b/src/npc/descriptions/crotch/vaginalAccessory.js @@ -3,6 +3,9 @@ * @returns {string} */ App.Desc.vaginalAccessory = function(slave) { + if (slave.vaginalAccessory === "none") { + return ""; + } const r = []; const { he, his, He, His @@ -10,35 +13,25 @@ App.Desc.vaginalAccessory = function(slave) { let held; if (slave.chastityVagina) { held = "held in place by a chastity belt"; - } else if (slave.vaginalAccessory === "bullet vibrator" || slave.vaginalAccessory === "smart bullet vibrator") { + } else if (dildoWidth(slave) === 0) { held = "held in place by a strap"; } else { held = `held in place by a strap, which ${he} can remove for vaginal intercourse`; } - switch (slave.vaginalAccessory) { - case "bullet vibrator": - case "smart bullet vibrator": // FIXME: two different descriptions? - r.push(`A bullet vibrator is attached on ${his} clit, ${held}.`); // FIXME: not super happy with this - break; - case "dildo": - /* TODO: these may need to be updated for slaves with gaping+ vaginas */ - r.push(`${His} pussy is filled by a dildo ${held}.`); - break; - case "long dildo": - r.push(`${His} pussy is filled by a very long dildo ${held}. It noticeably bulges ${his} stomach.`); + const dildo = App.Data.vaginalAccessories.get(slave.vaginalAccessory) || V.customItem.dildos.get(slave.vaginalAccessory); + switch (dildo.width) { + case 0: + r.push(`A ${slave.vaginalAccessory} is attached on ${his} clit, ${held}.`); // FIXME: not super happy with this break; - case "large dildo": - r.push(`${His} pussy is`); - if (slave.vagina < 2) { - r.push(`painfully stretched`); - } else if (slave.vagina < 3) { - r.push(`uncomfortably filled`); + case 1: + if (dildo.length === 1) { + /* TODO: these may need to be updated for slaves with gaping+ vaginas */ + r.push(`${His} pussy is filled by a dildo ${held}.`); } else { - r.push(`comfortably filled`); + r.push(`${His} pussy is filled by a very long dildo ${held}. It noticeably bulges ${his} stomach.`); } - r.push(`by a large dildo ${held}.`); break; - case "long, large dildo": + case 2: r.push(`${His} pussy is`); if (slave.vagina < 2) { r.push(`painfully stretched`); @@ -47,33 +40,35 @@ App.Desc.vaginalAccessory = function(slave) { } else { r.push(`comfortably filled`); } - r.push(`by a very long and large dildo ${held}. It noticeably bulges ${his} stomach.`); - break; - case "huge dildo": - if (slave.vagina < 4) { - r.push(`${His} pussy is filled to the breaking point by an enormous dildo.`); - if (slave.fetish === "masochist" && slave.fetishKnown === 1 && slave.fetishStrength > 60) { - r.push(`${He} can barely move with the discomfort, but ${he} frequently climaxes with agony.`); - } else { - r.push(`${He} can barely move with the discomfort, and ${he} sometimes breaks down in tears at having ${his} cunt permanently stretched.`); - } + if (dildo.length === 1) { + r.push(`by a large dildo ${held}.`); } else { - r.push(`${His} cavernous pussy is comfortably filled by a huge dildo.`); - } - if (slave.chastityVagina) { - r.push(`A chastity belt locks it securely in place.`); + r.push(`by a very long and large dildo ${held}. It noticeably bulges ${his} stomach.`); } break; - case "long, huge dildo": - if (slave.vagina < 4) { - r.push(`${His} pussy is filled to the breaking point by an enormously wide and long dildo. It noticeably bulges ${his} stomach.`); - if (slave.fetish === "masochist" && slave.fetishKnown === 1 && slave.fetishStrength > 60) { - r.push(`${He} can barely move with the discomfort, but ${he} frequently climaxes with agony.`); + case 3: + if (dildo.length === 1) { + if (slave.vagina < 4) { + r.push(`${His} pussy is filled to the breaking point by an enormous dildo.`); + if (slave.fetish === "masochist" && slave.fetishKnown === 1 && slave.fetishStrength > 60) { + r.push(`${He} can barely move with the discomfort, but ${he} frequently climaxes with agony.`); + } else { + r.push(`${He} can barely move with the discomfort, and ${he} sometimes breaks down in tears at having ${his} cunt permanently stretched.`); + } } else { - r.push(`${He} can barely move with the discomfort, and ${he} sometimes breaks down in tears at having ${his} cunt permanently stretched.`); + r.push(`${His} cavernous pussy is comfortably filled by a huge dildo.`); } } else { - r.push(`${His} cavernous pussy is comfortably filled by an enormously wide and long dildo. It noticeably bulges ${his} stomach.`); + if (slave.vagina < 4) { + r.push(`${His} pussy is filled to the breaking point by an enormously wide and long dildo. It noticeably bulges ${his} stomach.`); + if (slave.fetish === "masochist" && slave.fetishKnown === 1 && slave.fetishStrength > 60) { + r.push(`${He} can barely move with the discomfort, but ${he} frequently climaxes with agony.`); + } else { + r.push(`${He} can barely move with the discomfort, and ${he} sometimes breaks down in tears at having ${his} cunt permanently stretched.`); + } + } else { + r.push(`${His} cavernous pussy is comfortably filled by an enormously wide and long dildo. It noticeably bulges ${his} stomach.`); + } } if (slave.chastityVagina) { r.push(`A chastity belt locks it securely in place.`); @@ -107,27 +102,25 @@ App.Desc.vaginalAttachment = function(slave) { const { his, He, His } = getPronouns(slave); - switch (slave.vaginalAttachment) { - case "vibrator": + switch (dildoVibeLevel(slave)) { + case 2: // TODO: not sure about this description - r.push(`${He} looks distinctly uncomfortable as ${his} dildo buzzes every so often.`); + r.push(`${His} dildo buzzes every so often, when prompted by the arcology's systems to train ${his} sexuality.`); if (slave.chastityVagina) { r.push(`The chastity belt locking it in place means there is no escape.`); } // TODO: add descriptions for slaves with gaping+ vaginas break; - case "smart vibrator": + case 1: // TODO: not sure about this description - r.push(`${His} dildo buzzes every so often, when prompted by the arcology's systems to train ${his} sexuality.`); + r.push(`${He} looks distinctly uncomfortable as ${his} dildo buzzes every so often.`); if (slave.chastityVagina) { r.push(`The chastity belt locking it in place means there is no escape.`); } // TODO: add descriptions for slaves with gaping+ vaginas break; - default: - if (!(["none", "bullet vibrator", "smart bullet vibrator"].includes(slave.vaginalAccessory))) { - r.push(`${His} current accessory is silent.`); - } + case 0: + r.push(`${His} current accessory is silent.`); } return r.join(" "); }; diff --git a/src/npc/descriptions/descriptionWidgets.js b/src/npc/descriptions/descriptionWidgets.js index fc40a143f5189de6e64078d7de6291a5de458fb3..fa0da8a7f21bae215aa3c3bf0aac65e9d6c79903 100644 --- a/src/npc/descriptions/descriptionWidgets.js +++ b/src/npc/descriptions/descriptionWidgets.js @@ -1441,7 +1441,7 @@ App.Desc.geneticQuirkAssessment = function(slave) { if (slave.geneticQuirks.androgyny === 2) { r.push(`${He} has a hormonal condition resulting in androgyny.`); } else if (slave.geneticQuirks.androgyny === 1 && V.geneticMappingUpgrade >= 2) { - r.push(`${He} is a carrier of a gene that result in androgyny.`); + r.push(`${He} is a carrier of a gene that results in androgyny.`); } if (slave.geneticQuirks.pFace === 2) { r.push(`${He} has an exceedingly rare trait associated with perfect facial beauty.`); diff --git a/src/npc/surgery/organFarm.js b/src/npc/surgery/organFarm.js index e1951cdaafe6f080a73af59d0162bdd2f72b74e5..7294c990068158e73cb30238a2893e46284ccbc0 100644 --- a/src/npc/surgery/organFarm.js +++ b/src/npc/surgery/organFarm.js @@ -55,7 +55,6 @@ App.Medicine.OrganFarm.growActions = function(slave) { // put everything in one string let r = ""; if (grow !== "") { - // div.grid-2columns-auto is defined in mainStyleSheet.css r += `The fabricator is ready to grow an organ for ${him}. Extract tissue to begin growing:<div class="grid-2columns-auto">${grow}</div>`; } if (wait !== []) { diff --git a/src/pregmod/cloningWorkaround.tw b/src/pregmod/cloningWorkaround.tw index 8be5b548e3c651d5b5cf9968dcd196c9a3405e8b..b4456a8f0355fe7502364a7b7b808867be953b67 100644 --- a/src/pregmod/cloningWorkaround.tw +++ b/src/pregmod/cloningWorkaround.tw @@ -8,7 +8,7 @@ <div class="note">Blank ovum prepared, please select genetic source and surrogate.</div> <div>Chosen source: _impreg</div> -<div class="majorText"> +<p> [[Yourself|Cloning Workaround][$donatrix = $PC]] <<for _cw = 0; _cw < $slaves.length; _cw++>> <<capture _cw>> @@ -20,10 +20,10 @@ <</if>> <</capture>> <</for>> -</div> +</p> <h2>Surrogate</h2> <div>Chosen surrogate: _receive</div> -<div class="majorText"> +<p> <<for _cw1 = 0; _cw1 < $slaves.length; _cw1++>> <<capture _cw1>> <<if ($slaves[_cw1].ovaries > 0 || $slaves[_cw1].mpreg > 0) && isSlaveAvailable($slaves[_cw1]) && $slaves[_cw1].preg >= 0 && $slaves[_cw1].preg < 4 && $slaves[_cw1].pregWeek >= 0 && $slaves[_cw1].pubertyXX == 1 && $slaves[_cw1].pregType < 12 && $slaves[_cw1].bellyImplant == -1 && $slaves[_cw1].broodmother == 0 && $slaves[_cw1].inflation <= 2 && $slaves[_cw1].physicalAge < 70>> @@ -52,9 +52,9 @@ <</if>> </div> <</if>> -</div> +</p> <h2>Implantation</h2> -<div class="majorText"> +<p> <<if _impreg != "Undecided" && _receive != "Undecided">> _impreg will be cloned and _receive shall act as the incubator. [[Implant clone ovum|Surrogacy][cashX(forceNeg($surgeryCost*2), "slaveSurgery"), $surgeryType = "clone"]] @@ -65,4 +65,4 @@ _receive shall act as the incubator. //Please select a genetic source// <<else>> //Please select a genetic source and surrogate// <</if>> -</div> +</p> diff --git a/src/uncategorized/managePenthouse.tw b/src/uncategorized/managePenthouse.tw index 34163138a6feb591ba32f7e89e4aeb2102fea304..7133d8f82669f540bda3db6de7e871ff67bd9d65 100644 --- a/src/uncategorized/managePenthouse.tw +++ b/src/uncategorized/managePenthouse.tw @@ -279,6 +279,15 @@ </div> <</if>> + <div> + <<if !$toyShop>> + [[Install a workshop for making custom toys|Manage Penthouse][cashX(-10000, "capEx"), $toyShop = true, $PC.skill.engineering += .1]] + <span class="detail">Costs <<print cashFormat(10000)>></span> + <<else>> + There is a [[workshop|Toy Shop]] for making custom toys. + <</if>> + </div> + <div> <<if $studio == 0>> [[Install a media hub to convert slave video feeds into pornography|Manage Penthouse][cashX(forceNeg(Math.trunc(10000*$upgradeMultiplierArcology)), "capEx"), $studio = 1, $PC.skill.engineering += 1]]