code:
        <canvas id="glcanvas" width="600px" height="750px"></canvas>

Display

            Fps
            <output class="output" id="fps"></output>

            rWidth
            <input class="textbox" type="text" id="rwidth" onchange="sceneParams.settings.rwidth = parseInt(this.value);">
            <output class="output"></output>
            rHeight
            <input class="textbox" type="text" id="rheight" onchange="sceneParams.settings.rheight = parseInt(this.value);">
            <output class="output"></output>

            Normals
            <input type="checkbox" id="normals" onchange="sceneParams.settings.normals = this.checked;">
            <output class="output"></output>
            Ambient
            <input type="checkbox" id="ambient" onchange="sceneParams.settings.ambient = this.checked;">
            <output class="output"></output>
            Diffuse
            <input type="checkbox" id="diffuse" onchange="sceneParams.settings.diffuse = this.checked;">
            <output class="output"></output>
            Specular
            <input type="checkbox" id="specular" onchange="sceneParams.settings.specular = this.checked;">
            <output class="output"></output>

            Normal
            <input type="checkbox" id="normal" onchange="sceneParams.settings.normal = this.checked;">
            <output class="output"></output>
            Emission
            <input type="checkbox" id="emission" onchange="sceneParams.settings.emission = this.checked;">
            <output class="output"></output>
            Alpha
            <input type="checkbox" id="alpha" onchange="sceneParams.settings.alpha = this.checked;">
            <output class="output"></output>
            BackG
            <input type="checkbox" id="background" onchange="sceneParams.background.visible = this.checked;">
            <output class="output"></output>

Tonemapping

            Rein
            <input class="textbox" type="text" id="whiteM" onchange="sceneParams.settings.whiteM = parseFloat(this.value);">
            <input type="checkbox" id="reinhard" onchange="sceneParams.settings.reinhard = this.checked;">
            Gamma
            <input class="textbox" type="text" id="gammaY" onchange="sceneParams.settings.gammaY = parseFloat(this.value);">
            <input type="checkbox" id="gamma" onchange="sceneParams.settings.gamma = this.checked;">

Camera

            X
            <input class="textbox" type="text" id="cam_x" onchange="sceneParams.camera.x = parseFloat(this.value);">
            <output class="output"></output>
            Y
            <input class="textbox" type="text" id="cam_y" onchange="sceneParams.camera.y = parseFloat(this.value);">
            <output class="output"></output>
            Z
            <input class="textbox" type="text" id="cam_z" onchange="sceneParams.camera.z = parseFloat(this.value);">
            <output class="output"></output>

            <form class="forms">
                XR
                <input class="slider" type="range" id="cam_xr" min="-180" max="180" oninput="cam_xr_out.value = cam_xr.value; sceneParams.camera.xr = parseFloat(this.value);">
                <output class="output" id="cam_xr_out"></output>
            </form>
            <form class="forms">
                YR
                <input class="slider" type="range" id="cam_yr" min="-180" max="180" oninput="cam_yr_out.value = cam_yr.value; sceneParams.camera.yr = parseFloat(this.value);">
                <output class="output" id="cam_yr_out"></output>
            </form>
            <form class="forms">
                ZR
                <input class="slider" type="range" id="cam_zr" min="-180" max="180" oninput="cam_zr_out.value = cam_zr.value; sceneParams.camera.zr = parseFloat(this.value);">
                <output class="output" id="cam_zr_out"></output>
            </form>

            Fnear
            <input class="textbox" type="text" id="cam_fnear" onchange="sceneParams.camera.fnear = this.value">
            <output class="output"></output>
            Ffar
            <input class="textbox" type="text" id="cam_ffar" onchange="sceneParams.camera.ffar = this.value">
            <output class="output"></output>
            <form class="forms">
                FOV
                <input class="slider" type="range" id="cam_fov" min="1" max="180" oninput="cam_fov_out.value = cam_fov.value; sceneParams.camera.fov = parseFloat(this.value);">
                <output class="output" id="cam_fov_out"></output>
            </form>

DirectionalLight

            <form class="forms">
                XR
                <input class="slider" type="range" id="light_xr" min="-90" max="90" oninput="light_xr_out.value = light_xr.value; sceneParams.directionalLights[0].xr = parseFloat(this.value);">
                <output class="output" id="light_xr_out"></output>
            </form>
            <form class="forms">
                YR
                <input class="slider" type="range" id="light_yr" min="-90" max="90" oninput="light_yr_out.value = light_yr.value; sceneParams.directionalLights[0].yr = parseFloat(this.value);">
                <output class="output" id="light_yr_out"></output>
            </form>

            <form class="forms">
                Int
                <input class="slider" type="range" id="light_int" min="0" max="3" step="0.05" oninput="light_int_out.value = light_int.value; sceneParams.directionalLights[0].intensity = parseFloat(this.value);">
                <output class="output" id="light_int_out"></output>
            </form>
            <form class="forms">
                Amb
                <input class="slider" type="range" id="light_amb" min="0" max="1" step="0.01" oninput="light_amb_out.value = light_amb.value; sceneParams.directionalLights[0].ambient = parseFloat(this.value);">
                <output class="output" id="light_amb_out"></output>
            </form>
            Color
            <input class="textbox" type="color" id="light_color" onchange="sceneParams.directionalLights[0].color = hexToRgb(this.value)">
            <output class="output"></output>

PointLight

            X
            <input class="textbox" type="text" id="point_light_x" onchange="sceneParams.pointLights[0].x = parseFloat(this.value);">
            <output class="output"></output>
            Y
            <input class="textbox" type="text" id="point_light_y" onchange="sceneParams.pointLights[0].y = parseFloat(this.value);">
            <output class="output"></output>
            Z
            <input class="textbox" type="text" id="point_light_z" onchange="sceneParams.pointLights[0].z = parseFloat(this.value);">
            <output class="output"></output>

            <form class="forms">
                Int
                <input class="slider" type="range" id="point_light_int" min="0" max="3" step="0.05" oninput="point_light_int_out.value = point_light_int.value; sceneParams.pointLights[0].intensity = parseFloat(this.value);">
                <output class="output" id="point_light_int_out"></output>
            </form>
            <form class="forms">
                Amb
                <input class="slider" type="range" id="point_light_amb" min="0" max="1" step="0.01" oninput="point_light_amb_out.value = point_light_amb.value; sceneParams.pointLights[0].ambient = parseFloat(this.value);">
                <output class="output" id="point_light_amb_out"></output>
            </form>
            Color
            <input class="textbox" type="color" id="point_light_color" onchange="sceneParams.pointLights[0].color = hexToRgb(this.value)">
            <output class="output"></output>

Object

            X
            <input class="textbox" type="text" id="obj_x" onchange="sceneParams.models[0].transform.x = parseFloat(this.value);">
            <output class="output"></output>
            Y
            <input class="textbox" type="text" id="obj_y" onchange="sceneParams.models[0].transform.y = parseFloat(this.value);">
            <output class="output"></output>
            Z
            <input class="textbox" type="text" id="obj_z" onchange="sceneParams.models[0].transform.z = parseFloat(this.value);">
            <output class="output"></output>
            Scale
            <input class="textbox" type="text" id="obj_scale" onchange="sceneParams.models[0].transform.scale = parseFloat(this.value);">
            <output class="output"></output>

            <form class="forms">
                XR
                <input class="slider" type="range" id="obj_xr" min="-180" max="180" oninput="obj_xr_out.value = obj_xr.value; sceneParams.transform.xr = parseFloat(this.value);">
                <output class="output" id="obj_xr_out"></output>
            </form>
            <form class="forms">
                YR
                <input class="slider" type="range" id="obj_yr" min="-180" max="180" oninput="obj_yr_out.value = obj_yr.value; sceneParams.transform.yr = parseFloat(this.value);">
                <output class="output" id="obj_yr_out"></output>
            </form>
            <form class="forms">
                ZR
                <input class="slider" type="range" id="obj_zr" min="-180" max="180" oninput="obj_zr_out.value = obj_zr.value; sceneParams.transform.zr = parseFloat(this.value);">
                <output class="output" id="obj_zr_out"></output>
            </form>

Morphs


intermediate: build

output: bin

TWEEGO_PATH: devTools/tweeGo/storyFormats

repo_name: Mirarara/fc

license: mit


code:
@echo off
:: Free Cities Basic Compiler - Windows

:: Set working directory
pushd %~dp0
SETLOCAL

:: If compile is invoked with "extramemory", set SORT_MEM (used by concatFiles.bat)

SET CMD_OPTION=%~1
IF DEFINED CMD_OPTION IF /I [%CMD_OPTION%]==[EXTRAMEMORY] SET CMD_OPTION=EXTRAMEM
IF DEFINED CMD_OPTION IF /I [%CMD_OPTION%]==[EMEMORY] SET CMD_OPTION=EXTRAMEM
IF DEFINED CMD_OPTION IF /I [%CMD_OPTION%]==[EXTRAMEM] SET SORT_MEM=65535

:: See if we can find a git installation
set GITFOUND=no
for %%k in (HKCU HKLM) do (
	for %%w in (\ \Wow6432Node\) do (
		for /f "skip=2 delims=: tokens=1*" %%a in ('reg query "%%k\SOFTWARE%%wMicrosoft\Windows\CurrentVersion\Uninstall\Git_is1" /v InstallLocation 2^> nul') do (
			for /f "tokens=3" %%z in ("%%a") do (
				set GIT=%%z:%%b
				set GITFOUND=yes
				goto FOUND
			)
		)
	)
)
:FOUND
if %GITFOUND% == yes (
	set "PATH=%GIT%bin;%PATH%"
	echo|set /p out="App.Version.commitHash = " > "%~dp0src\002-config\fc-version.js.commitHash.js"
	git rev-parse --sq --short HEAD >> "%~dp0src\002-config\fc-version.js.commitHash.js" 2>NUL
	if errorlevel 1 echo|set /p out="null" >> "%~dp0src\002-config\fc-version.js.commitHash.js"
	echo|set /p out=";" >> "%~dp0src\002-config\fc-version.js.commitHash.js"
)

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
SET TWEEGO_PATH=%~dp0devTools\tweeGo\storyFormats
:: 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 --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 --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"

ENDLOCAL
popd
ECHO Done


code:
#!/bin/bash

output=/dev/stdout

# displays help text
function displayHelp() {
	cat <<HelpText
Usage: compile.sh [OPTION]...

Options:
  -d, --dry      Do not compile
  -g, --git      Add hash of HEAD to filename
  -h, --help     Show this help text
  -s, --sanity   Run sanityCheck
  -q, --quiet    Suppress terminal output
  -t, --themes   Generate theme files
  -m, --minify   Minify output files
  --ci           CI mode
HelpText
}

#display an error message
function echoError() {
	echo -e "\033[0;31m$*\033[0m"
}

#display message
function echoMessage() {
	echo "$1" >"${output}"
}

#compile the HTML file
function compile() {
	mkdir -p bin/resources
	export TWEEGO_PATH=devTools/tweeGo/storyFormats
	TWEEGO_EXE="tweego"

	if hash $TWEEGO_EXE 2>/dev/null; then
		echoMessage "system tweego binary"
	else
		case "$(uname -m)" in
			x86_64 | amd64)
				echoMessage "x64 arch"
				if [ "$(uname -s)" = "Darwin" ]; then
					TWEEGO_EXE="./devTools/tweeGo/tweego_osx64"
				elif [ "$OSTYPE" = "msys" ]; then
					TWEEGO_EXE="./devTools/tweeGo/tweego_win64"
				else
					TWEEGO_EXE="./devTools/tweeGo/tweego_nix64"
				fi
				;;
			x86 | i[3-6]86)
				echoMessage "x86 arch"
				if [ "$(uname -s)" = "Darwin" ]; then
					TWEEGO_EXE="./devTools/tweeGo/tweego_osx86"
				elif [ "$OSTYPE" = "msys" ]; then
					TWEEGO_EXE="./devTools/tweeGo/tweego_win86"
				else
					TWEEGO_EXE="./devTools/tweeGo/tweego_nix86"
				fi
				;;
			*)
				echoError "No system tweego binary found, and no precompiled binary for your platform available."
				echoError "Please compile tweego and put the executable in PATH."
				exit 2
				;;
		esac
	fi

	if [ "$(uname -m)" = "x86_64" ] || [ "$(uname -m)" = "amd64" ]; then
    if [ "$(uname -s)" = "Darwin" ]; then
      MINIFY_EXE="./devTools/minify/minify_darwin_amd64"
    elif [ "$OSTYPE" = "msys" ]; then
      MINIFY_EXE="./devTools/minify/minify_win_amd64.exe"
    else
      MINIFY_EXE="./devTools/minify/minify_linux_amd64"
    fi
	fi

	file="bin/FC_pregmod.html"

	# Find and insert current commit
	if [[ "$ci" ]]; then
		COMMIT=$CI_COMMIT_SHORT_SHA
	elif [[ -d .git ]]; then
		COMMIT=$(git rev-parse --short HEAD)
		if [[ "$usehash" ]]; then
			file="bin/FC_pregmod_${COMMIT}.html"
		fi
	fi
	if [[ "$minify" ]]; then
		final_file=$file
		file="bin/tmp.html"
	fi

	if [[ "$COMMIT" ]]; then
		printf "App.Version.commitHash = '%s';\n" "${COMMIT}" > src/002-config/fc-version.js.commitHash.js
	fi

	devTools/concatFiles.sh js/ '*.js' bin/fc.js
	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
	fi

	if [[ "$minify" ]]; then
		if [[ "$MINIFY_EXE" ]]; then
			# SC license is inside an HTML comment, so keep them.
			# eval depends on local variables, so don't modify them (Config, Engine, ...)
			$MINIFY_EXE --html-keep-comments --js-keep-var-names "$file" > "$final_file"
			rm -f "$file"
		else
			echoError "Minification only available on amd64 systems."
			mv "$file" "$final_file"
		fi
		file=$final_file
	fi

	if [[ "$ci" || -d .git ]]; then
		rm src/002-config/fc-version.js.commitHash.js
	fi
	echoMessage "Saved to $file."
}

if [[ "$1" == "" ]]; then
	#tip if no option
	echoMessage "For more options see compile.sh -h."
else
	#parse options
	while [[ "$1" ]]; do
		case $1 in
			-d | --dry)
				dry="true"
				;;
			-g | --git)
				usehash="true"
				;;
			-h | --help)
				displayHelp
				exit 0
				;;
			-s | --sanity)
				sanity="true"
				;;
			-q | --quiet)
				output=/dev/null
				;;
			-t | --themes)
				themes="true"
				;;
			-m | --minify)
				minify="true"
				;;
			--ci)
				ci="true"
				;;
			*)
				echoError "Unknown argument $1."
				displayHelp
				exit 1
				;;
		esac
		shift
	done
fi

# Run sanity check.
[ -n "$sanity" ] && ./sanityCheck.sh

if ! [[ -d .git ]]; then
	echoMessage "No git repository. Git specific actions disabled."
fi

#compile
if [[ "$dry" ]]; then
	echoMessage "Dry run finished."
else
	compile
	echoMessage "Compilation finished at $(date +%T)."
fi

# compile themes
if [[ "$themes" ]]; then
	(
		cd themes/ || exit
		for D in *; do
			if [ -d "${D}" ]; then
				../devTools/concatFiles.sh "${D}"/ '*.css' ../bin/"${D}".css
			fi
		done
	)
	echoMessage "Themes compiled at $(date +%T)"
fi


code:
@echo off
:: Free Cities Basic Compiler - Windows

:: Set working directory
pushd %~dp0

:: See if we can find a git installation
set GITFOUND=no
for %%k in (HKCU HKLM) do (
	for %%w in (\ \Wow6432Node\) do (
		for /f "skip=2 delims=: tokens=1*" %%a in ('reg query "%%k\SOFTWARE%%wMicrosoft\Windows\CurrentVersion\Uninstall\Git_is1" /v InstallLocation 2^> nul') do (
			for /f "tokens=3" %%z in ("%%a") do (
				set GIT=%%z:%%b
				set GITFOUND=yes
				goto FOUND
			)
		)
	)
)
:FOUND
if %GITFOUND% == yes (
	set "PATH=%GIT%bin;%PATH%"
	bash --login -c "./sanityCheck.sh"
)

:: Compile the game
call "%~dp0compile.bat"

popd
PAUSE


code:
@echo off
:: Free Cities Basic Compiler - Windows

:: Set working directory
pushd %~dp0

:: Compile the game
call "%~dp0compile.bat"

popd
PAUSE


code:
@echo off

set back=%cd%
for /d %%i in (%~dp0\themes\*) do (
    CALL :compileDirectory %%i
)
cd %back%

EXIT /B %ERRORLEVEL%

:compileDirectory
REM ~1 is an absolute path, get name of directory here
REM https://stackoverflow.com/a/5480568
set var1=%~1%
set var2=%var1%
set i=0

:loopprocess
for /F "tokens=1* delims=\" %%A in ( "%var1%" ) do (
  set /A i+=1
  set var1=%%B
  goto loopprocess
)

for /F "tokens=%i% delims=\" %%G in ( "%var2%" ) do set last=%%G

REM compile
CALL devTools/concatFiles.bat "%%~1" "*.css" bin\"%last%".css
EXIT /B 0


code:
/*! <<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}


code:
:root {
	--button-color: #252525;
	--button-border-color: #333333;
	--button-selected-color: #050505;
	--button-hover-color: #414141;
	--button-disabled-color: #1a1a1a;

	--link-color: #68D;
	--link-hover-color: #8af
}


code:
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;
}

/* fix dialog title centering */
#ui-dialog-title {
	padding-left: 3.5em;
}


code:
/* change some SC2 styles */

/* make the sidebar more compact by reducing the space between major parts */
#ui-bar-body {
	/* height: calc(100% - 2.5em); */
	/* margin: 2.5em 0; */
	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);
}


code:
.building {
	display: flex;
	flex-direction: column;
	width: 100%;
}

.building.basement {
	border-top: solid 1px #333333;
	margin-top: -1px;
	background-image: repeating-linear-gradient(135deg, transparent, transparent 20px, #333333 20px, #333333 30px);
}

.building .row {
	display: flex;
	flex-direction: row;
	width: 95%;
	margin: 0 auto;
	justify-content: center;
}

@media only screen and (min-width: 1600px) {
	.building .row {
		width: 70%;
	}
}

.building .outerCell {
	/* fill cell fully, part 1: trick to fill the full height even if content is smaller */
	display: flex;
	flex-direction: row;
}

.building .innerCell {
	margin: 3px;
	border: 5px solid;
	padding: 2px;
	text-align: center;
	/* fill cell fully, part 2: full width */
	width: 100%;
	/* overwriting with the default background color to hide the basement indicator */
	background-color: #111;
}

.building .decorative {
	outline: white solid 5px;
	outline-offset: -8px;
	height: 2em;
}

/* introduction special formatting */
/* makes all links unusable */
.intro .building a {
	color: white;
	pointer-events: none;
	cursor: default;
}

.intro .building .hotkey {
	display: none;
}

/* penthouse formatting */
.building .gridWrapper {
	display: grid;
}

.building .gridWrapper.grid1 {
	grid-template-columns: 100%;
}

.building .gridWrapper.grid2 {
	grid-template-columns: repeat(2, 50%);
}

.building .gridWrapper.grid3 {
	grid-template-columns: repeat(3, 33.3%);
}

.building .gridWrapper div {
	display: inline flow-root;
	line-height: 1.1;
	padding-bottom: 0.3em;
}

.building .collapsed {
	display: inline flow-root;
	margin: 0 0.2em;
}

/* border color for each cell */
.building .row .apartments {
	border-color: limegreen;
}

.building .row .arcade {
	border-color: deeppink;
}

.building .row .brothel {
	border-color: violet;
}

.building .row .barracks {
	border-color: olivedrab;
}

.building .row .club {
	border-color: orchid;
}

.building .row .corporateMarket {
	border-color: purple;
}

.building .row .dairy {
	border-color: white;
}

.building .row .denseApartments {
	border-color: seagreen;
}

.building .row .empty {
	border-color: lightgray;
}

.building .row .farmyard {
	border-color: brown;
}

.building .row .fsShops {
	border-color: mediumpurple;
}

.building .row .manufacturing {
	border-color: slategray;
}

.building .row .markets {
	border-color: mediumorchid;
}

.building .row .nursery {
	border-color: deepskyblue;
}

.building .row .luxuryApartments {
	border-color: palegreen;
}

.building .row .pens {
	border-color: goldenrod;
}

.building .row .penthouse {
	border-color: teal;
}

.building .row .pit {
	border-color: orangered;
}

.building .row .private {
	border-color: red;
}

.building .row .shops {
	border-color: thistle;
}

.building .row .sweatshops {
	border-color: gray;
}

.building .row .transport-hub {
	border-color: magenta;
}

.building .row .weaponsManufacturing {
	border-color: springgreen;
}

#arcology-building-container {
	margin-bottom: 2em;
}


code:
/* 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 {
	align-items: flex-start;
	background-color: rgba(80, 80, 80, 0.5);
	display: flex;
	flex-direction: column;
	flex-wrap: wrap;
	position: relative;
}

.tinyImg {
	border: 1px solid #333333;
	float: left;
	height: 8em;
	width: 8em;
}

.smlImg {
	height: 10em;
	width: 10em;
	float: left;
}

.smlImg > img, .smlImg > video {
	height: auto;
}

.medImg {
	height: 16em;
	width: 16em;
	float: right;
}

.medImg > img, .medImg > video {
	height: auto;
}

.lrgRender {
	border: 2px solid #333333;
	float: right;
	margin-left: 1em;
	margin-top: 1em;
	width: 33%;
}

.lrgVector {
	border: 2px solid #333333;
	float: right;
	height: 40em;
	margin-left: 1em;
	margin-top: 1em;
	width: 33%;
}

.lrgVector.custom {
	height: auto;
}

.lrgRender > svg {
	height: 40em;
	position: relative;
}

object {
	object-fit: scale-down;
	position: absolute;
	top: 0;
	left: 0;
}

img.paperdoll {
	position: absolute;
	top: 0;
	left: 0;
	margin-left: 0;
}

img.assistant {
	float: right;
	border: 3px hidden;
	object-fit: contain;
}


code:
.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;
}


code:
# 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 the `<head>` element of the final HTML file.


code:
.profile-events {
	display: grid;
	grid-template-columns: max-content max-content max-content auto;
	grid-column-gap: 1em;
}


code:
.fctv {
	display: float;
}

.fctv-remote {
	text-align: center;
	justify-items: center;
	display: grid;
	float: left;
	width: min-content;
	padding-right: 20px;
}
.fctv-remote-numbers {
	display: grid;
	grid-gap: 3px;
	grid-template-columns: repeat(3, min-content);
	justify-items:center;
}
.fctv-remote-button {
	margin-top: 10px;
}


code:
#init-screen > div.endweek-titleblock {
	display: block;
	margin-top: 5%;
}

div.endweek-maintitle {
	display: block;
	margin-bottom: 0.5em;
}

div.endweek-subtitle {
	display: block;
	font-size: smaller;
	font-weight: lighter;
}


code:
div.slave-report {
	margin-top: 1em;
	margin-bottom: 1em;
}


code:
div.event-section {
	margin-top: 1em;
	margin-bottom: 1em;
}


code:
.incubator-underscore {
	border-bottom: 1px solid;
}

.incubator-tank {
	border-bottom: 2px solid cyan;
	border-top: 2px solid cyan;
	border-radius: 15px;
	padding: 0.5em;
}


code:
.child-section {
	margin-top: 1em;
	margin-bottom: 1em;
}


code:
table.facility-stats {
	width: 100%;
	padding-left: 20px;
	padding-right: 20px;
}

table.facility-stats > tr.header {
	border-bottom: 2px solid white;
}

table.facility-stats > tr.total {
	border-top: 1px solid white;
}

table.facility-stats > tr > th.narrow {
	width: 10em;
	text-align: right;
}

table.facility-stats > tr > th.wide {
	width: 20em;
	text-align: right;
}

table.facility-stats-slave {
	width: 100%;
	font-size: 90%;
	line-height: 110%;
}

table.facility-stats-slave > tr {
	border-bottom: 1px solid #aaa;
	border-left: none;
	border-right: none;
	border-top: none
}

table.facility-stats-slave > tr > th.narrow {
	width: 11em;
	text-align: right;
}

table.facility-stats-slave > tr > th.wide {
	width: 22em;
	text-align: right;
}

td.value {
	padding-right: 3px;
	text-align: right;
}

.decimalZero {
	opacity: 0.3;
}


code:
.wardrobe-shopping-block {
	display: flex;
	flex-wrap: wrap;
}

.wardrobe-shopping-cell {
	display: inline-block;
	width: 20em;
	border: 1px solid var(--button-border-color);
}

.wardrobe-shopping-cell:hover { background: var(--button-hover-color) }


code:
/* Styles that mainly affect how text looks, but not where it is */

.scene-intro,	/* setting at the beginning of a scene / subscene */
.detail,		/* adds detail to an option: Do something. <span class="detail">Sentence that explains the effect/conditions */
.note,			/* additional information not related to a specific option */
.italics {
	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 & bold are deprecated, use custom classes instead */
/* :not(.defiant) : quick fix to make defiant styles look correct */
.major-link, .bold:not(.defiant), .strong {
	font-weight: bold;
}

.monospace {
	font-family: monospace;
}

.strikethrough {
	text-decoration: line-through
}

.clear-formatting {
	color: white;
	font-weight: normal;
	font-style: normal;
}

.clear-formatting a {
	color: var(--link-color) !important;
}

.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;
}

.uppercase {
	text-transform: uppercase;
}

dt {
	font-weight: bold;
}

dd {
	margin-bottom: 1em;
}

dt::after {
	content: ":";
}


code:
/* Styles that mainly affect where text is, but not how it looks */

h1, h2, h3, h4 {
	margin-bottom: 0;
	margin-top: 0.25em;
}

h1 + p, h2 + p, h3 + p, h4 + p {
	margin-top: 0;
}

.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 every 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;
	grid-column-gap: 1em;
}

div.grid-3columns-auto {
	display: grid;
	grid-template-columns: max-content auto auto;
	grid-column-gap: 1em;
}

.margin-top {
	margin-top: 1em;
}

.margin-bottom {
	margin-bottom: 1em;
}

.margin-left {
	margin-left: 2em;
}

.margin-right {
	margin-right: 2em;
}

.margin-x {
	margin-left: 2em;
	margin-right: 2em;
}

.margin-y {
	margin-top: 1em;
	margin-bottom: 1em;
}

.margin-full {
	margin: 1em;
}

.padding-left {
	padding-left: 2em;
}

.padding-right {
	padding-right: 2em;
}

.padding-x {
	padding-left: 2em;
	padding-right: 2em;
}

.padding-y {
	padding-top: 1em;
	padding-bottom: 1em;
}

.padding-full {
	padding: 1em;
}

.padded-columns {
	border-collapse: separate;
	border-spacing: 1em 0;
}

.padded-columns td,
.padded-columns th {
	padding: 0 1em;
}

.padded-rows {
	border-collapse: separate;
	border-spacing: 0 1em;
}

.padded-rows td {
	padding: 1em 0;
}

.space-evenly {
	justify-content: space-evenly;
}

.absolute {
	position: absolute;
}

/* 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;
}

input[type="text"].number {
	min-width: 6em;
	max-width: 6em;
}


code:
/* 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: text */

/* TODO: remove all color class names (e.g. ".cyan") once all instances are removed in code */

/* 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, .prestigious,
.prosperity.inc {
	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 a, .education.neg a, .unintelligent {
	color: orangered
}

/* 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, .food.dec, .food.dec a, .stat.drop, .stat.drop a, .flaw, .flaw 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, .prosperity.dec {
	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, .food {
	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
}

.cash.note {
	color: seagreen;
}

.white a {
	color: white
}

.violet, .libido.inc {
	color: violet
}

.khaki, .libido.dec {
	color: khaki
}

.race, .nationality {
	color: tan
}


code:
/* --- base functionality --- */

.accordion-content.hidden {
	display: none;
}

/* --- no button case --- */

:not(button).accordion {
	cursor: pointer;
}

/* --- button/div case --- */

/* style button */
button.accordion {
	width: 100%;
	margin: 5px 0;
	border: 2px solid var(--button-border-color);
	padding: 10px;
	padding-left: 2.2em;
	background-color: var(--button-selected-color);
	/* to position the open/close symbol */
	position: relative;
}

button.accordion.closed {
	background-color: var(--button-color);
}

button.accordion.empty {
	background-color: var(--button-disabled-color);
	cursor: default;
}

button.accordion:hover:not(.empty) {
	background-color: var(--button-hover-color);
}

/* open/close symbol */
button.accordion::before {
	font-family: "tme-fa-icons";
	position: absolute;
	left: 10px;
	content: "\e81c";
}

button.accordion.closed::before {
	content: "\e81e";
}

button.accordion.empty::before {
	content: none;
}

/* hide content */
div.accordion-content {
	margin: 0 15px;
}

/* modifiers for the toggle button */
button.accordion span.title {
	float: left;
}

button.accordion span.info {
	float: right;
}


code:
.purchase-button {
	background-color: var(--button-color);
	border: solid 2px var(--button-border-color);
	font-style: normal;
	margin: 0.25em 1em;
	outline: none;
	transition: 0.2s;
}

.purchase-button:hover {
	background-color: var(--button-hover-color);
	border: solid 2px var(--button-border-color);
}

.purchase-button.disabled, .purchase-button.disabled:hover {
	background-color: black;
	cursor: not-allowed;
}


code:
.encyclopedia.topic {
	font-weight: bold;
}

/* mark text that is a link/button somewhere else */
/* Click X to do Y */
.encyclopedia.interaction {
	background: #203e6c;
	border-radius: 5px;
	border: hidden;
	padding: 2px 4px;
	white-space: nowrap;
	font-size: smaller;
}

.encyclopedia-source::before {
	content: "— ";
}

.encyclopedia-source .article {
	font-style: italic;
}


code:
.favorite, .favorite:hover {
	color: yellow;
	text-decoration: none;
}

.not-favorite, .not-favorite:hover {
	color: grey;
	text-decoration: none;
}


code:
div.hotkey-settings {
	display: grid;
	grid-template-columns: repeat(3, max-content) auto;
}

@media only screen and (min-width: 1600px) {
	div.hotkey-settings {
		grid-template-columns: repeat(3, max-content) auto repeat(3, max-content) auto;
	}
}

div.hotkey-settings div.description {
	margin-right: 10px;
	/* center text vertically */
	display: flex;
	justify-content: center;
	flex-direction: column;
}

div.hotkey-settings button {
	margin: 5px;
	border-width: 2px;
	background-color: var(--button-color);
	border-color: var(--button-border-color);
	width: 70px;
}

div.hotkey-settings button.combination {
	min-width: 150px;
	border-width: 0;
}

div.hotkey-settings button.inactive, div.hotkey-settings button.inactive:hover {
	background-color: var(--button-selected-color);
	cursor: default;

}

div.hotkey-settings button:hover {
	background-color: var(--button-hover-color);
	border-color: var(--button-border-color);
}


code:
ul.choices-strip {
	display: inline;
	list-style-type: none;
	padding: 0mm;
	margin-left: 0em;
}

ul.choices-strip li {
	display: inline;
}

ul.choices-strip li + li:before {
	content: " | ";
}

a.disabled {
	color: white;
	pointer-events: none;
	cursor: default;
}


code:
.no-bullet {
	list-style-type: none;
}


code:
div.options-group {
	display: grid;
	grid-template-columns: max-content auto;
	align-items: center;
}

/* left side */
div.options-group div.description {
	margin-right: 10px;
}

/* right side */
div.options-group div.button-group {
	margin: 6px 0;
}

.button-group button {
	color: var(--link-color);
	background-color: var(--button-color);
	border: none; /* outline instead of border */
	/* left & right outline overlap each other so we don't have a double border */
	outline: solid 2px var(--button-border-color);
	margin-left: 2px;
	/* half the outline width for multirow buttongroups */
	margin-top: 1px;
	margin-bottom: 1px;
}

.button-group button:hover {
	background-color: var(--button-hover-color);
	color: var(--link-hover-color)
}

.button-group button.selected {
	background-color: var(--button-selected-color);
}

.button-group button.disabled {
	color: white;
	pointer-events: none;
	cursor: default;
}

div.options-group button.selected.on {
	background-color: #103d10;
}

div.options-group button.on:hover {
	background-color: #1b651b;
}

div.options-group button.selected.off {
	background-color: #40100d;
}

div.options-group button.off:hover {
	background-color: #6a1b16;
}

div.options-group .comment {
	color: gray;
	font-style: italic;
	margin-left: 10px;
}

/* input box */
div.options-group input {
	border: 2px solid var(--button-border-color);
	min-width: unset; /* remove SC styling */
	width: 12em;
	/* move back so that the outline of a potential select overlaps in front */
	position: relative;
	z-index: 0;
}

.options-group input:hover, .options-group input:focus {
	/* show highlighted border in front of neighbours */
	z-index: 1
}

div.options-group input.number {
	width: 4em;
}

div.options-group input.full-width {
	width: 100%;
}

/* custom row */
.options-group .custom-row {
	grid-column-start: span 2;
	width: 70vw
}

.options-group select {
	border: none; /* outline instead of border */
	/* left & right outline overlap each other so we don't have a double border */
	outline: solid 2px var(--button-border-color);
	margin-left: 2px;
	min-width: 12em;
	/* move in front of a potential textbox, so the outline overlaps the border of the textbox */
	position: relative;
	z-index: 1;
}

.options-group select:hover {
	outline: solid 2px #eee;
}

/* double column */
@media only screen and (min-width: 1600px) {
	.options-group.double {
		grid-template-columns: max-content auto max-content auto;
	}

	.options-group.double .custom-row {
		width: 35vw
	}
}

/* other */
.subHeading {
	width: 85%;
	text-align: center;
	margin-top: 1.5em;
}

.scLink {
	width: 85%;
	text-align: center;
}
.scLink2 {
	width: 73%;
	text-align: center;
}

table.invisible {
	table-layout: fixed;
	border-collapse: separate;
	border-spacing: 5px;
	margin:1em auto;
}


code:
div.quick-links {
	/* Give quick links as much space as possible, any more and it start looking wrong. */
	margin: 0 -7px;
	/* the last menu link has a bottom outline, make enough space for it */
	margin-bottom: 2px;
}

div.quick-links div.toggle {
	position: relative; /* so ::before/::after works in relation to this element */
	background-color: #444444;
	cursor: pointer;
}

div.quick-links div.toggle:hover {
	background-color: #5f5f5f;
}

div.quick-links div.toggle::before {
	font-family: "tme-fa-icons";
	position: absolute;
	left: 5px;
	content: "\e818";
}

div.quick-links div.collapsed div.toggle::before {
	content: "\e81a";
}

div.quick-links div.content {
	margin: 0 5px;
}

div.quick-links div.collapsed div.content {
	display: none
}

div.quick-links div.menu-link {
	background-color: #2b2b2b;
	border: solid #3c3c3c;
	border-width: 0 2px;
	margin: 0 2px;
	/* we cannot detect if an element has something after it, so we just add a shadow to every element. Only for the
		last element the shadow is not hidden behind another element. */
	box-shadow: 0 2px 0 0 #3c3c3c;
	/* make sure the notification is relative to the correct element */
	position: relative;
}

div.quick-links > div.menu-link:first-child, /* give the very first link an upper border */
div.quick-links div:not(.menu-link):not(.collapsed) + div.menu-link /* give the link directly after an opened toggle an upper border */
{
	border-top-width: 2px;
}

/* notification */
div.quick-links div.notification:not(.category)::after /* notification for entry */,
div.quick-links div.category.notification.collapsed > div.toggle::after /* notification for category, disable when uncollapsed */
{
	font-family: "tme-fa-icons";
	position: absolute;
	right: 5px;
	top: 0;
	content: "\e80c";
	color: yellow;
}


code:
.card {
	border: 2px solid #333333;
	background-color: #1a1a1a;
	box-shadow: 10px 10px 10px black,
		-10px 10px 10px black;
	padding: 1em;
	margin-bottom: 1em;
}


code:
.ql-hidden
{
	display:none;
}

div.quick-list.devotion button.mindbroken
{
	background-color:red;
}
div.quick-list.devotion button.very-hateful
{
	background-color:darkviolet;
}
div.quick-list.devotion button.hateful
{
	background-color:darkviolet;
}
div.quick-list.devotion button.resistant
{
	background-color:mediumorchid;
}
div.quick-list.devotion button.ambivalent
{
	background-color: yellow;
	color: #444444;
}
div.quick-list.devotion button.accepting
{
	background-color: hotpink;
}
div.quick-list.devotion button.devoted
{
	background-color: deeppink;
}
div.quick-list.devotion button.worshipful
{
	background-color: magenta;
}
div.quick-list.trust button.mindbroken
{
	background-color:red;
}
div.quick-list.trust button.extremely-terrified
{
	background-color: darkgoldenrod;
}
div.quick-list.trust button.terrified
{
	background-color: goldenrod;
}
div.quick-list.trust button.frightened
{
	background-color: gold;
	color: coral;
}
div.quick-list.trust button.fearful
{
	background-color: yellow;
	color: green;
}
div.quick-list.trust button.hate-careful
{
	background-color: orange;
}
div.quick-list.trust button.careful
{
	background-color: mediumaquamarine;
	color: forestgreen;
}
div.quick-list.trust button.bold
{
	background-color: orangered;
}
div.quick-list.trust button.trusting
{
	background-color: mediumseagreen;
}
div.quick-list.trust button.defiant
{
	background-color: darkred;
}
div.quick-list.trust button.profoundly-trusting
{
	background-color: seagreen;
}
div.quick-list
{
	table-layout: fixed;
	text-align: center;
	border-collapse: separate;
	border-spacing: 2px;
	border-style: hidden;
	empty-cells: hide;
	width: 70%;
}
div.quick-list button
{
	margin-top: 15px;
	margin-right: 20px;
	white-space: nowrap;
}


code:
div.slaveSummary {
	clear: both;
}

/* slave summary paragraph when "see images" is enabled */
p.si {
	margin-bottom: 0;
	margin-top: 0;
	text-indent: 1.5em;
}

span.freeAssignment {
	color: lawngreen;
	text-decoration: underline;
	font-weight: bold;
}

/* Slave Summary Block */
.ssb {
	display: inline-block;
	margin-right: 2em;
	text-indent: 0;
}


code:
div.tab-bar {
	overflow: hidden;
}

div.tab-bar button {
	background-color: var(--button-color);
	border: solid 2px var(--button-color);
	color: var(--link-color);
	float: left;
	outline: none;
	cursor: pointer;
	padding: 1ex 1ex;
	transition: 0.2s;
	font-size: large;
}

div.tab-bar button.card {
	border-top-left-radius: 15px;
	border-top-right-radius: 15px;
	border: none;
}

div.tab-bar button.card.active {
	background-color: #1a1a1a;
}

div.tab-bar button:hover {
	background-color: var(--button-hover-color);
}

div.tab-bar button.active {
	background-color: var(--button-selected-color);
	color: #c7cedf;
}

div.tab-bar button.show-warning { /* dumb name, but warning and error already exist */
	background-color: #b30000;
	border-color: #b30000;
}

div.tab-bar button.show-warning:hover {
	background-color: #e60000
}

div.tab-bar button.show-warning.active {
	background-color: #4d0000;
}

div.tab-bar a.active {
	color: white;
	pointer-events: none;
	cursor: default;
}

.tab-content {
	display: none;
}

.tab-content.active {
	display: block;
}

.tab-content:not(.no-fade) {
	padding: 6px 12px;
	-webkit-animation: fadeEffect 0.3s;
	animation: fadeEffect 0.3s;
}

.tab-content.card {
	border-radius: 0 8px 8px 8px;
	background-color: #1a1a1a;
	border: 0;
}

.tab-content.card .slaveSummary.card {
	background-color: #252525;
}

@-webkit-keyframes fadeEffect {
	from {
		opacity: 0;
	}

	to {
		opacity: 1;
	}
}

@keyframes fadeEffect {
	from {
		opacity: 0;
	}

	to {
		opacity: 1;
	}
}


code:
.has-tooltip {
	text-decoration: underline dotted;
}

.tippy-content {
	text-indent: initial;
}

.tippy-content ul {
	margin: 5px;
}
.tippy-content ul:not(.choices-strip) {
	padding-left: 10px;
}

.tippy-content .tip-details {
	font-size: smaller;
	/* if there isn't enough space vertically, add a scrollbar */
	overflow-y: auto;
	max-height: 95vh;
}


code:
div.output {
	width: 100vw;
	max-width: 100%;
	word-break: break-all;
	white-space: normal;
}


code:
#edit-family {
	display: flex;
	flex-wrap: wrap;
	align-items: center;
}


code:
div.limb-selector {
	display: grid;
	grid-template-columns: 200px 100px 100px 100px 100px;
}

div.limb-selector div.full {
	grid-column-start: 1;
	grid-column-end: 6;
	text-align: center;
}

div.eyeContainer {
	display: grid;
	grid-template-columns: 80px 50px 70px 50px;
}

div.buy-prosthetics {
	display: grid;
	grid-template-columns: repeat(4, max-content);
	grid-column-gap: 40px;
}
div.buy-prosthetics div.full {
	grid-column-start: 2;
	grid-column-end: 5;
}
div.buy-prosthetics div.research {
	grid-column-start: 3;
	grid-column-end: 5;
	text-align: center;
}


code:
.adjacent-slave {
	font-weight: bold;
}

.interact-name {
	margin: 0 2em;
}

.si-header {
	font-size: 1.5em;
}

/* notification */
a.with-note::after /*notification for links with notes in tooltips */
{
	font-family: "tme-fa-icons";
	content: " \e80c";
	color: yellow;
}


code:
.filter-row .button-group {
	margin: 1em;
}


code:
.customize-slave-trade-ul {
	list-style-type: none;
	content: '';
	width: 100%;
	display: inline-block;
}

.customize-slave-trade-li-container {
	float: right;
	width: 5em;
	text-align: left;
}

.customize-slave-trade-li {
	text-align: center;
	display: inline-block;
	padding: 2px;
	width: 15em;
}

span.plusButton {
	display: inline-block;
	line-height: 25px;
	width: 20px;
	text-align: center;
	border: 1px solid rgba(0, 139, 0, 0.3);
	background: rgba(0, 139, 0, 0.2);
	margin: 2px;
}

span.minusButton {
	display: inline-block;
	line-height: 25px;
	width: 20px;
	text-align: center;
	border: 1px solid rgba(184, 0, 0, 0.3);
	background: rgba(184, 0, 0, 0.2);
	margin: 2px;
}

span.zeroButton {
	display: inline-block;
	line-height: 25px;
	width: 20px;
	text-align: center;
	border: 1px solid rgba(0, 0, 255, 0.3);
	background: rgba(0, 0, 255, 0.2);
	margin: 2px;
}

span.plusButton:hover { background: rgba(0, 139, 0, 0.4); }
span.minusButton:hover { background: rgba(184, 0, 0, 0.4); }
span.zeroButton:hover { background: rgba(0, 0, 255, 0.4); }

span.plusButton > a { display: block; }
span.minusButton > a { display: block; }
span.zeroButton > a { display: block; }

span.plusButton > a:hover { text-decoration: none; }
span.minusButton > a:hover { text-decoration: none; }
span.zeroButton > a:hover { text-decoration: none; }


code:
table.budget {
	text-align: right;
	border-collapse: separate;
	width: 90%;
	border-style: solid;
	border-width: 1px;
	border-color: white;
	padding: 5px;
	font-family: monospace;
}
table.budget .colored {
	background-color: #001700;
}

table.budget .accordion:not(.closed) .cash {
	color: gray;
}

table.budget .accordion > :first-child {
	position: relative;
}

table.budget .accordion > :first-child::before {
	font-family: "tme-fa-icons";
	position: absolute;
	left: 10px;
	content: "\e81c";
}
table.budget .accordion.closed > :first-child::before {
	content: "\e81e";
}


code:
.main-fcnn {
	text-align: center;
	margin: 0 auto;
}


code:
.neighbor-container {
	background-color: rgba(17,17,17,1);
	padding: 5px;
	max-width: fit-content;
	margin: 0 auto;
}

.neighbor-container-grid {
	display: grid;
	grid-template-columns: auto auto auto;
}

.neighbor-container-list {
	display: flex;
	flex-flow: row wrap;
	align-items: flex-start;
}

.neighbor-item {
	margin: 3px;
	border: 5px solid;
	padding: 10px;
	text-align: center;
}

.neighbor-item-selected {
	background-color: rgba(255, 255, 255, 0.2);
}

.neighbor-item-empty {
	border-color: rgba(17,17,17,1);
}

.neighbor-item-self {
	border-color: white;
}

.neighbor-item-owned {
	border-color: steelblue;
}

.neighbor-item-unowned {
	border-color: red;
}

.neighbor-item-rival {
	border-color: crimson;
}


code:
table.slave-on-slave-feeding {
	width: 90%;
}

table.slave-on-slave-feeding tr {
	vertical-align: top;
}


code:
@media only screen and (min-width: 1000px) {
    .rule-builder {
        display: grid;
        grid-template-columns: 60% 40%;
        grid-column-gap: 1em;
    }
}

.rule-builder button {
    color: var(--link-color);
    background-color: var(--button-color);
    border: solid 2px var(--button-border-color);
    border-radius: 4px;
    margin-left: 4px;
}

.rule-builder button:hover {
    background-color: var(--button-hover-color);
    color: var(--link-hover-color);
}

.rule-builder textarea {
    margin-left: 0.2em;
    min-width: 20em;
}

.rule-part-browser {
}

.rule-part {
    display: inline-block;
    border-radius: 8px;
    border: 2px solid #333333;
    background-color: #1a1a1a;
    padding: 4px;
    margin: 4px;
}

.validation-error::before {
    font-family: "tme-fa-icons";
    content: "\e80d";
    color: red;
    margin-right: 4px;
}

.rule-draggable {
    cursor: grab;
}

.rule-draggable:hover{
    background: #2c2c2c;
}

.rule-drag-element {
    display: inline-block;
    background-image: repeating-linear-gradient(0, #1a1a1a, transparent 0.2em, transparent 0.2em, #1a1a1a 0.4em),
    repeating-linear-gradient(90deg, #1a1a1a, #777 0.2em, #777 0.2em, #1a1a1a 0.4em);
    width: 1.6em;
    height: 2em;
    vertical-align: middle;
}

.rule-drag-element:hover{
    background-image: repeating-linear-gradient(0, #2c2c2c, transparent 0.2em, transparent 0.2em, #2c2c2c 0.4em),
    repeating-linear-gradient(90deg, #2c2c2c, #888 0.2em, #888 0.2em, #2c2c2c 0.4em);
}

.rule-drop-location {
    border: #999 dashed 1px;
    border-radius: 4px;
    display: inline-block;
    background-color: #555;
    width: 5em;
    height: 1.5em;
    vertical-align: middle;
    margin: 0 4px;
}

.part-dragging .condition-viewer .rule-drop-location {
    animation: 1.5s ease-in-out infinite rule-drop-location-blink;
}

@keyframes rule-drop-location-blink {
    0% {
        background: #555;
    }
    50% {
        background: #638022;
    }
    100% {
        background: #555;
    }
}

.rule-builder input[type="text"] {
    margin-left: 0.2em;
}

.rule-right-margin {
    margin-right: 0.2em;
}

.rule-left-margin {
    margin-left: 0.2em;
}

.rule-custom-controls {
    display: inline-block;
    vertical-align: top;
}

.rule-custom-mode {
    text-align: center;
}

.rule-trash {
    border: #F55 1px;
    border-radius: 4px;
    background-color: palevioletred;
    width: 12em;
    height: 2em;
    text-align: center;
    margin: 4px;
    color: black;
}

.rule-trash::before {
    font-family: "tme-fa-icons";
    content: "\e828";
}

/* Encyclopedia help entry */

.rule-help-table {
    display: grid;
    grid-template-columns: max-content auto auto;
}

.rule-help-table .head {
    font-weight: bold;
    position: sticky;
    top: -1em;
    background-color: #111;
}

.rule-help-table > div {
    padding: 0 0.5em
}

.rule-help-table > :nth-child(6n+4),
.rule-help-table > :nth-child(6n+5),
.rule-help-table > :nth-child(6n+6) {
    background-color: #222;
}


code:
.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;
}


code:
.ra-onoffswitch {
	display: inline-block;
	position: relative; width: 4em;
	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;
	position: absolute; top: 0; bottom: 0;
	right: 2.1em;
	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;
}

.ra-container {
	display: grid;
	grid-template-columns: minmax(100px, max-content) auto;
	grid-row-gap: 0.5ex;
}

.ra-label {
	grid-column: 1;
}

.ra-label::after {
	content: ":";
	margin-right: 0.5em;
}

.ra-sub-label {
	font-style: italic;
	margin-left: 2.5em;
}

.ra-sub-label::after {
	content: ":";
	margin-right: 0.5em;
}

.ra-inline-label {
	margin-right: 0.5em;
}

.ra-inline-label::after {
	content: ":";
}

.ra-setters {
	margin-top: 3ex;
}


code:
table.ra-sum {
	text-align: left;
	empty-cells: hide;
}

th.ra-sum, td.ra-sum {
	border: 1px solid grey;
}

td.ra-sum {
	white-space: nowrap;
	overflow: hidden;
}

tr.ra-sum:nth-child(even) {
	background-color: #444444;
}

tr.ra-sum.header {
	position:sticky;
	top:0px;
	z-index:2;
	background:#111;
}

th.ra-sum.first-header-cell {
	empty-cells: show;
	border-style: hidden
}

td.ra-sum.row-title {
	position:sticky;
	left: 0px;
	z-index:1;
	background:#111;
	opacity: 0.8;
}


code:
# Anatomy of a FreeCities event #

## Type ##
There are several types of events. They all happen during the end-of-week calculation, AFTER the normal changes to the slaves and all the economic effects (including you messing with your corporation) happened.

Scheduled events
Nonrandom events
Random nonindividual events
Random individual events

The differences between them are almost non-existent. If they happen, they happen in this order, so you could say it's a kind of event priority ordering. The last two events pre-select a slave (in $eventSlave), with the "nonindividual" events using all your slaves while the "individual" events use only non-Fuckdolls, typically from your penthouse. When writing your event, you're free to ignore this and choose your own slave or create a new one. By convention, scheduled events tend to go back to the "Scheduled Event" passage so that other such events can run; all the others tend to just skip to the next event category. Nothing in code forces you to do it this way for your events.

## Preconditions ##
Most events have some kind of precondition for when they happen. Scheduled events always happen when their preconditions are true. Nonrandom events happen when their preconditions are true and no other nonrandom events get picked first (so writing a too-often-true precondition is a good way to break the game by blocking any further such events). The two other types of events get put in a pool ($events) if they match the precondition, then at most one event gets pulled from the pool per type.

	NonRandomEvent (26-33)
	```
	<<elseif (_effectiveWeek == 14) && $badC != 1>>
	<<set _valid = $slaves.find(function(s) { return s.curatives > 1 || s.inflationType == "curative"; })>>
	<<if def _valid>>
		<<set $badC = 1, $Event = "bad curatives">>
		<<goto "Generic Plot Events">>
	<<else>>
		<<set $badC = 1>>
		<<goto "Nonrandom Event">>
	<</if>>
	```
If it is week fourteen and the player hasn't ready seen the event, a check is then made for slaves that either are on curatives or have their implants filled by curatives. If it was successful then load the "bad curatives" generic event, if unsuccessful set the flag anyway and read from the Nonrandom Event passage.

## Immediate effects ##

Every event can have immediate effects, which happen when the event gets chosen. For most events, those are what should happen if the player ignores the event (by hitting "Continue" or the space bar on the keyboard). Choice effects (see below) can override or roll back those.
```
	reRecruit (4-19)
	<<if Array.isArray($recruit)>>
		<<if $cheatMode == 1>>
			<<set $nextButton = "Back", $nextLink = "Nonrandom Event", $returnTo = "Nonrandom Event">> /* if user just clicks spacebar */
			''A random recruit event would have been selected from the following:''
			<br>
			<<for _i = 0; _i < $recruit.length; _i++>>
				<<print "[[$recruit[_i]|RE recruit][$recruit = $recruit[" + _i + "]]]">>
				<br>
			<</for>>
			<br><br>[[Go Back to Random Nonindividual Event|Random Nonindividual Event][$eventSlave = 0]]
		<<else>>
			<<set $recruit = $recruit.random()>>
			<<goto "RE recruit">>
		<</if>>
	<<else>>
```
If cheat mode is enabled and the user presses the space bar go back to the start.

## Main event text ##
The bulk of the writing will be in the main event text. There are quite a few rules to deal with here.
The PC is referred to in the second person singular ("you"), everyone else in third person.
The PC has no direct speech. All the things "you" say are described, not quoted.
A slave's description can be linked from an event by replacing their name with `<<= App.UI.slaveDescriptionDialog(_Slave)>>`. This allows the player to click on the slave name and view their description, then go back to the event.  This is not a passage transition so you don't need to worry about preserving temporary state.
If you want to introduce a new actor by their relationship to another actor, use `<<= contextualIntro(_firstSlave, _newSlave)>>`.  You can pass a third parameter of "true" if you want the new actor's name to be linked to their description dialog.

`<<SlaveTitle _Slave>>` sets `$desc` (which ends up being a string like "slavegirl", "MILF", "futanari" and so on, depending on slave).

`<<setLocalPronouns _Slave>>` allows you to use the variables $pronoun ("she"/"he"/"it"), $pronounCap ("She"/"He"/"It"), $possessive ("her"/"his"/"its"), $possessiveCap ("Her"/"His"/"Its") and $object ("her"/"him"/"it"). There is NO variable for self-possession ("hers"/"his"/"its") and for "herself", you need to use `<<= $object>>`self.
One more macro initializes several others and is required when you have a slave speak and want to use direct quotes: `<<Enunciate _Slave>>` allows you to use `<<Master>>`, `<<WrittenMaster>>`, `<<says>>` (which turns into "lisps" when that's the case) and the lisping replacers `<<s>>`, `<<ss>>`, `<<S>>`, `<<c>>` and `<<z>>`.

The text should be about large enough to fit on the screen assuming typical monitor sizes. In terms of visible text, about 1000 words are a fine limit to aim for. There's a lot to keep in mind in terms of different appearances and circumstances, so keep your document with slave variables as a reference nearby.

It's fine — and a part of the normal workflow — to first write an event without any variation, then go through it and vary the text here and there.

## Choices ##
You should keep the amount of choices small, but not too small. About three to five is generally a good number. Choices which can't be taken due to the current situation should be displayed as such ("You lack the funds ...") if they are an obvious choice, hidden when they aren't (for example, in event chains you might want to hide choices if the player didn't do something specific or didn't acquire some specific bit of knowledge). Every choice should be a simple sentence of the form "Do something." followed by a short explanation of the obvious effects.

Choices should also be hidden when they run against the game rules, like for example the setting if the player wants to see "extreme" content.
```
	diary (313-325)
	<<if $dairyFeedersUpgrade == 1>>
		The milking machines can hold feeders in slaves' mouths and inject drugs into their bodies, ensuring ideal nutrition and production.
		<br>    The feeders are
		<<if $dairyFeedersSetting == 2>>
			''industrial.'' [[Moderate|Dairy][$dairyFeedersSetting = 1, $dairyFeedersSettingChanged = -1]]
		<<elseif $dairyFeedersSetting == 1>>
			''active.'' [[Inactive|Dairy][$dairyFeedersSetting = 0]]<<if ($seeExtreme != 0) && ($dairyRestraintsSetting == 2)>> | [[Industrial|Dairy][$dairyFeedersSetting = 2, $dairyFeedersSettingChanged = 1]]<</if>>
		<<else>>
			''inactive.'' [[Active|Dairy][$dairyFeedersSetting = 1]]
		<</if>>
	<<else>>
		$dairyNameCaps is equipped to feed and clean slaves normally. [[Upgrade the milking machines with intubators|Dairy][cashX(forceNeg(_Tmult1), "capEx"), $dairyFeedersUpgrade = 1]] //Costs ¤_Tmult1 and will increase upkeep costs. cashX is the proper way to handle cash payments. The forceNeg part just means "make sure what comes next is negative if it isn't already, because I want it to cost the player money." "capEx" is the budget category you want this transaction recorded under. You can search through the game files to find similar transactions. //
	<</if>>
```
	In order to enable the industrial feeder option both any of the see extreme content options has be enabled and the restraint's have to be already set to industrial.

Remember that "do nothing" is almost always a choice (it's called "Continue" and can be found on the left side of the screen) so your events don't need this as an extra choice.

## Choice text ##
This should be a short text describing the effects of your choice. Generally shorter than the main text, but all the other things mentioned there apply.
Try to keep surprise buttsex to a minimum.

For example this cut up version of "paternalist encounter" from REFS (lines 106-139).
```
	<span id="result">
		<<link "Alert your drones and keep walking">>
		<</link>>
		<<if $cash >= 2000>>
			<br><<link "Take the poor slave $girl into your custody">>
			<</link>>
		<</if>>
		<br><<link "Publicly confront the citizen">>
		<</link>>
	</span>
	So here you can either, A) "Alert your drones and keep walking", B) if $cash is above 2000 you can take acquire the slave or C) "Publicly confront the citizen".
```
## Choice effect ##
A choice doesn't need to have a specific effect. If your event has an immediate effect, remember to take that into account when you decide on the choice's effects.
```
	<span id="result">
		<<link "Alert your drones and keep walking">>
			<<replace "#result">>
				You inform $assistant.name that you have a slave beater in need of detainment by your security drones, then continue on your way confident in your knowledge that the citizen will soon be in custody.
			<</replace>>
		<</link>>
		<<if $cash >= 2000>>
			<br><<link "Take the poor slave $girl into your custody">>
				<<set $activeSlave.clothes = "no clothing">>
				<<replace "#art-frame">>
					/* 000-250-006 */
					<<if $seeImages == 1>>
						<<if $imageChoice == 1>>
							<div class="imageRef lrgVector"><div class="mask"> </div><<= SlaveArt($activeSlave, 2, 0)>></div>
						<<else>>
							<div class="imageRef lrgRender"><div class="mask"> </div><<= SlaveArt($activeSlave, 2, 0)>></div>
						<</if>>
					<</if>>
					/* 000-250-006 */
				<</replace>>
				<<replace "#result">>
					Confronting the citizen is simplicity in itself; he would not dare defy you under threat of arrest by your security drones and is unlikely to garner any sympathy from the public for his degradationist behaviors. As such, you are able to take civil ownership over the poor slave $girl and take $him into your care with only minimal compensation to the citizen. As you stride away from $his former owner with the $girl in your arms, $he leans over to plant a chaste kiss of thanks on your cheek.
					<<run cashX(-2000, "slaveTransfer", $activeSlave)>>
					<<include "New Slave Intro">>
				<</replace>>
			<</link>> // Taking custody of the $girl will cost <<print cashFormat(2000)>>. //
		<</if>>
		<br><<link "Publicly confront the citizen">>
			<<replace "#result">>
				Your walk up to the citizen is not accompanied by shaking ground or tumultuous fanfare, yet the citizen looks as if death itself has come before him. You don't hurt him physically, instead chastising him publicly in front of his fellow peers who begin to cheer their agreement. You end your tirade of verbal abuse with a reminder that although the man is a citizen of your arcology, that does not give him the impunity to shirk the law. To make it clear his next offense will be his last, a brace of your security drones hover behind you threateningly. The crowd that gathered @@.green;approve of your rebuke of the citizen.@@
				<<run repX(2500, "event")>>
			<</replace>>
		<</link>>
	</span>
```
So here the results of the choices are, A) nothing, B) reduce cash by 2000 but acquire the slave C) chastise the citizen for plus 500 rep.


code:
artist notes
-------------
TO USE: SELECT VECTOR ART BY NOX/DEEPMURK

CREDITS
-------------
Nov_X/NoX (Original Artist, whose work I built off of)
skinAnon (For doing the color hexes on hundreds of skin/nipple tones.)
@prndev (For dynamic belly scaling magic)
@klorpa (For fixing many of my mistakes/spaghetti art code)
@kopareigns (For fixing many of my mistakes/spaghetti art code)
@pregmodder (Fixes and more art)

FOR MANUAL USE
-------------
1. Split source_vector_ndmain.svg and source_vector_ndextras.svg into src/art/vector/layer.
Note#1 source_vector.svg is a legacy version (before the art was changed) and is not used for anything.
Note#2 vector_revamp_source.svg not related and belongs to the other artist.

TO PLAY WITHOUT FACES
-------------
1. Go to pregmod/src/art/vector
2. Open head.tw in notepad/notepad++
3. Delete everything from Line 30 to Line 979... you'll see it says faceShape, eyebrowFullness, etc-- all of those are related to faces and can be deleted. (AKA just delete everything between the lines that says /* FACIAL APPEARANCE */ and /* END FACIAL APPEARANCE */)
4. Compile and play game.

known issues
-------------
	-minor clipping issue leg/ass outfits due to their outfit transparency effects
	-not all outfit art works with amputees
	-minor hair clipping on some outfits
	-heavy lip piercings look wonky on open mouth art
	-heavy/light piercings on face seem to override each other

---------------------------------------------------------------------------------------------------------------------------------------------
pending requests/suggestions
-------------
	-loli/shota bodies

pending outfit requests
-------------
	-opaque stockings with ribbons

planned additions
-------------
	-more hair styles
	-facepaint
	-alternate makeup options
	-rework all AI avatars
	-dick piercings (stalled due to planned code change)
	-more outfits, see current queue ( https://gitgud.io/deepmurk/fc-pregmod/issues/1 )

---------------------------------------------------------------------------------------------------------------------------------------------

v1.7 (12/22/2018)
-------------
	-added muscle definition (heavy)
	-added colorable sclera
	-added colorable eyebrows
	-added purple hair color
	-added dark orchid hair color
	-added sea green hair color
	-added green-yellow hair color
	-added dark blue hair color
	-added missing AI avatars
	-fixed faces & skintones not showing on custom ethnicities
	-added jet black hair color
	-changed black hair color
	-changed auburn hair color
	-alphabetized some options in the salon
	-miscellaneous tweaks to some other colors

v1.6 (11/18/2018)
-------------
	-misc art fixes
	-added muscle definition (low)
	-added muscle definition (medium)
	-shibari rope outfit is now red for better contrast on some skins
	-fixed hair showing when ability to grow hair was surgically removed
	-fixed muscles showing on amputated slave limbs
	-fixed faces showing on Fuckdolls
	-fixed "mixed race" skin tone/face issues
	-fixed some issues related to belly outfits

v1.5 (10/21/2018)
-------------
	-removed penis head piercing light flaccid (art only)
	-removed penis head piercing light erect (art only)
	-removed penis head piercing heavy flaccid (art only)
	-removed penis head piecing heavy erect (art only)
	-corrected ku klux klan robe description grammar
	-added burkini outfit
	-added hijab and blouse outfit
	-changed the code that affects art layer names due to conflicts with new outfits
	-changed art layer name of cutoffs to cutoffsandatshirt
	-changed art layer name of niqab to niqabandabaya
	-changed art layer name of hijab to hijabandabaya
	-changed art layer name of spats to spatsandatanktop
	-changed art layer name of stretchpants to stretchpantsandacroptop
	-changed art layer name of blouse to hijabandblouse
	-changed blouse and hijab outfit string name to hijab and blouse
	-changed shimapan panties outfit string name to striped panties
	-added bra outfit
	-added button-up shirt outfit
	-added button-up shirt and panties outfit
	-added gothic lolita dress outfit
	-added hanbok outfit
		-added nice pony outfit (no art yet)
	-added one-piece swimsuit outfit
	-added police uniform outfit
	-added skimpy loincloth outfit
	-added slutty klan robe outfit
		-added slutty pony outfit (no art yet)
	-added sports bra outfit
	-added striped bra outfit
	-added sweater outfit
	-added sweater and cutoffs outfit
	-added sweater and panties outfit
	-added t-shirt outfit
	-added t-shirt and jeans outfit
	-added t-shirt and panties outfit
	-added t-shirt and thong outfit
	-added tank-top outfit
	-added tank-top and panties outfit
	-added thong outfit
	-added tube top outfit
	-added tube top and thong outfit
	-added oversized t-shirt outfit
	-added oversized t-shirt and boyshorts outfit
	-added boyshorts outfit
	-added cutoffs outfit
	-added jeans outfit
	-added leather pants outfit
	-added leather pants and a tube top outfit
	-added leather pants and pasties outfit
	-added panties outfit
	-added panties and pasties outfit
	-added sport shorts outfit
	-added sport shorts and a sports bra outfit
	-added sport shorts and a t-shirt outfit
	-added striped underwear outfit
	-increased size of armpit hair art
	-changed minidress outfit to black color (per request)
	-misc art fixes
	-added kitty lingerie outfit

v1.4 (09/29/2018)
-------------
	-fixed facial markings showing on restrictive latex
	-fixed error on certain clothes when slave is an amputee
	-added ku klux klan outfit
	-added burqa outfit
	-added hijab and abaya outfit
	-changed niqab and abaya outfit
	-added shimapan panty outfit
	-fixed malay race not having faces
	-added penis head piercing light flaccid (art only)
	-added penis head piercing light erect (art only)
	-added penis head piercing heavy flaccid (art only)
	-added penis head piecing heavy erect (art only)
	-added nose piercing light
	-added nose piercing heavy
	-added lip piercing light
	-added lip piercing heavy
	-added eyebrow piercing light
	-added eyebrow piercing heavy
	-fixed some eyebrow types not coloring correctly when dyeing
	-fixed chastity belt showing incorrectly on some bodies (chubby, fat, obese)
	-fixed hijab head outfit showing incorrectly on faces
	-added cybernetic feet basic
	-added cybernetic leg narrow basic
	-added cybernetic leg normal basic
	-added cybernetic leg wide basic
	-added cybernetic leg thick basic
	-added cybernetic butt 0 basic
	-added cybernetic butt 1 basic
	-added cybernetic butt 2 basic
	-added cybernetic butt 3 basic
	-added cybernetic butt 4 basic
	-added cybernetic butt 5 basic
	-added cybernetic butt 6 basic
	-added cybernetic arm left thumb down basic
	-added cybernetic arm left rebel basic
	-added cybernetic arm left high basic
	-added cybernetic arm left mid basic
	-added cybernetic arm left low basic
	-added cybernetic arm right high basic
	-added cybernetic arm right mid basic
	-added cybernetic arm right low basic
	-added cybernetic feet sexy
	-added cybernetic leg narrow sexy
	-added cybernetic leg normal sexy
	-added cybernetic leg wide sexy
	-added cybernetic leg thick sexy
	-added cybernetic butt 0 sexy
	-added cybernetic butt 1 sexy
	-added cybernetic butt 2 sexy
	-added cybernetic butt 3 sexy
	-added cybernetic butt 4 sexy
	-added cybernetic butt 5 sexy
	-added cybernetic butt 6 sexy
	-added cybernetic arm left thumb down sexy
	-added cybernetic arm left rebel sexy
	-added cybernetic arm left high sexy
	-added cybernetic arm left mid sexy
	-added cybernetic arm left low sexy
	-added cybernetic arm right high sexy
	-added cybernetic arm right mid sexy
	-added cybernetic arm right low sexy
	-added cybernetic feet beauty
	-added cybernetic leg narrow beauty
	-added cybernetic leg normal beauty
	-added cybernetic leg wide beauty
	-added cybernetic leg thick beauty
	-added cybernetic butt 0 beauty
	-added cybernetic butt 1 beauty
	-added cybernetic butt 2 beauty
	-added cybernetic butt 3 beauty
	-added cybernetic butt 4 beauty
	-added cybernetic butt 5 beauty
	-added cybernetic butt 6 beauty
	-added cybernetic arm left thumb down beauty
	-added cybernetic arm left rebel beauty
	-added cybernetic arm left high beauty
	-added cybernetic arm left mid beauty
	-added cybernetic arm left low beauty
	-added cybernetic arm right high beauty
	-added cybernetic arm right mid beauty
	-added cybernetic arm right low beauty
	-added cybernetic feet combat
	-added cybernetic leg narrow combat
	-added cybernetic leg normal combat
	-added cybernetic leg wide combat
	-added cybernetic leg thick combat
	-added cybernetic butt 0 combat
	-added cybernetic butt 1 combat
	-added cybernetic butt 2 combat
	-added cybernetic butt 3 combat
	-added cybernetic butt 4 combat
	-added cybernetic butt 5 combat
	-added cybernetic butt 6 combat
	-added cybernetic arm left thumb down combat
	-added cybernetic arm left rebel combat
	-added cybernetic arm left high combat
	-added cybernetic arm left mid combat
	-added cybernetic arm left low combat
	-added cybernetic arm right high combat
	-added cybernetic arm right mid combat
	-added cybernetic arm right low combat
	-added cybernetic feet swiss
	-added cybernetic leg narrow swiss
	-added cybernetic leg normal swiss
	-added cybernetic leg wide swiss
	-added cybernetic leg thick swiss
	-added cybernetic butt 0 swiss
	-added cybernetic butt 1 swiss
	-added cybernetic butt 2 swiss
	-added cybernetic butt 3 swiss
	-added cybernetic butt 4 swiss
	-added cybernetic butt 5 swiss
	-added cybernetic butt 6 swiss
	-added cybernetic arm left thumb down swiss
	-added cybernetic arm left rebel swiss
	-added cybernetic arm left high swiss
	-added cybernetic arm left mid swiss
	-added cybernetic arm left low swiss
	-added cybernetic arm right high swiss
	-added cybernetic arm right mid swiss
	-added cybernetic arm right low swiss
	-added penis flaccid circumcised 0
	-added penis flaccid circumcised 1
	-added penis flaccid circumcised 2
	-added penis flaccid circumcised 3
	-added penis flaccid circumcised 4
	-added penis flaccid circumcised 5
	-added penis flaccid circumcised 6
	-added penis flaccid circumcised 7
	-added penis flaccid circumcised 8
	-added penis flaccid circumcised 9
	-added penis flaccid circumcised 10
	-added penis erect circumcised 0
	-added penis erect circumcised 1
	-added penis erect circumcised 2
	-added penis erect circumcised 3
	-added penis erect circumcised 4
	-added penis erect circumcised 5
	-added penis erect circumcised 6
	-added penis erect circumcised 7
	-added penis erect circumcised 8
	-added penis erect circumcised 9
	-added penis erect circumcised 10

v1.3 (09/22/2018)
-------------
	-fixed shaved sides hairstyle showing incorrectly
	-fixed faces showing on restrictive latex
	-fixed restrictive latex not showing on bodies (chubby, fat, obese)
	-fixed accent band not showing on kimono belly outfits
	-fixed facial markings showing incorrectly on faces (birthmark,etc)
	-added eye coloring (irises only)
	-fixed lips showing only one color
	-added fox ears and tail
	-added cat ears and tail
	-fixed nipples not showing on attractive lingerie for a pregnant woman outfit
	-fixed black colored nipples showing on latex and bodysuits
	-fixed head accessory alignment to new faces (ball gag, dildo gag, etc)
	-changed art on porcelain mask
	-added eyes type-d
	-added mouth type-d
	-added nose type-d
	-added eyebrows type-d pencilthin
	-added eyebrows type-d thin
	-added eyebrows type-d threaded
	-added eyebrows type-d natural
	-added eyebrows type-d tapered
	-added eyebrows type-d thick
	-added eyebrows type-d bushy
	-added eyes type-e
	-added mouth type-e
	-added nose type-e
	-added eyebrows type-e pencilthin
	-added eyebrows type-e thin
	-added eyebrows type-e threaded
	-added eyebrows type-e natural
	-added eyebrows type-e tapered
	-added eyebrows type-e thick
	-added eyebrows type-e bushy
	-added eyes type-f
	-added mouth type-f
	-added nose type-f
	-added eyebrows type-f pencilthin
	-added eyebrows type-f thin
	-added eyebrows type-f threaded
	-added eyebrows type-f natural
	-added eyebrows type-f tapered
	-added eyebrows type-f thick
	-added eyebrows type-f bushy
	-separated faces by race/head shape (eg: white/exotic is different from asian/exotic)
	-made some eye types smaller
	-fixed stockings not covering thick thighs properly

v1.2 (09/16/2018)
-------------
	-added naked apron outfit (chubby, fat, obese)
	-added attractive lingerie (chubby, fat, obese)
	-added ballgown outfit (chubby, fat, obese)
	-added battlearmor outfit (chubby, fat, obese)
	-added battledress outfit (chubby, fat, obese)
	-added biyelgee costume (chubby, fat, obese)
	-added body oil outfit (chubby, fat, obese)
	-added bunny outfit (chubby, fat, obese)
	-added chains outfit (chubby, fat, obese)
	-added chattel habit outfit (chubby, fat, obese)
	-added cheerleader outfit (chubby, fat, obese)
	-added clubslut outfit (chubby, fat, obese)
	-added comfortable bodysuit outfit (chubby, fat, obese)
	-added conservative outfit (chubby, fat, obese)
	-added cutoffs and tshirt outfit (chubby, fat, obese)
	-added dirndl outfit (chubby, fat, obese)
	-added fallennun habit outfit (chubby, fat, obese)
	-added haltertop dress outfit (chubby, fat, obese)
	-added harem gauze outfit (chubby, fat, obese)
	-added hijab and abaya outfit (chubby, fat, obese)
	-added huipil outfit (chubby, fat, obese)
	-added kimono outfit (chubby, fat, obese)
	-added latex outfit (chubby, fat, obese)
	-added attractive lingerie for pregnant woman outfit (chubby, fat, obese)
	-added leotard outfit (chubby, fat, obese)
	-added lederhosen outfit (chubby, fat, obese)
	-added long qipao outfit (chubby, fat, obese)
	-added maternity dress outfit (chubby, fat, obese)
	-added military uniform outfit (chubby, fat, obese)
	-added minidress outfit (chubby, fat, obese)
	-added monikini outfit (chubby, fat, obese)
	-added mounty outfit (chubby, fat, obese)
	-added nice business attire outfit (chubby, fat, obese)
	-added nice maid outfit (chubby, fat, obese)
	-added nice nurse outfit (chubby, fat, obese)
	-added penitent nuns habit outfit (chubby, fat, obese)
	-added red army uniform outfit (chubby, fat, obese)
	-added scalemail bikini outfit (chubby, fat, obese)
	-added schoolgirl outfit (chubby, fat, obese)
	-added schutzstaffel uniform outfit (chubby, fat, obese)
	-added schutzstaffel uniform slutty outfit (chubby, fat, obese)
	-added shine outfit [Only applies to latex] (chubby, fat, obese)
	-added shibari rope outfit (chubby, fat, obese)
	-added slutty outfit (chubby, fat, obese)
	-reworked slutty outfit (changed to pasties)
	-added slave gown outfit (chubby, fat, obese)
	-added slutty business attire outfit (chubby, fat, obese)
	-added slutty jewelry outfit (chubby, fat, obese)
	-added slutty maid outfit (chubby, fat, obese)
	-added slutty nurse outfit (chubby, fat, obese)
	-updated slutty nurse outfit (now with 100% more hat)
	-added slutty qipao outfit (chubby, fat, obese)
	-added spats outfit (chubby, fat, obese)
	-added stretch pants outfit (chubby, fat, obese)
	-added string bikini outfit (chubby, fat, obese)
	-added succubus outfit (chubby, fat, obese)
	-added toga outfit (chubby, fat, obese)
	-added uncomfortable strap outfit (chubby, fat, obese)
	-added western outfit (chubby, fat, obese)
	-added eyes type-a
	-added mouth type-a
	-added nose type-a
	-added eyebrows type-a pencilthin
	-added eyebrows type-a thin
	-added eyebrows type-a threaded
	-added eyebrows type-a natural
	-added eyebrows type-a tapered
	-added eyebrows type-a thick
	-added eyebrows type-a bushy
	-added eyes type-b
	-added mouth type-b
	-added nose type-b
	-added eyebrows type-b pencilthin
	-added eyebrows type-b thin
	-added eyebrows type-b threaded
	-added eyebrows type-b natural
	-added eyebrows type-b tapered
	-added eyebrows type-b thick
	-added eyebrows type-b bushy
	-added eyes type-c
	-added mouth type-c
	-added nose type-c
	-added eyebrows type-c pencilthin
	-added eyebrows type-c thin
	-added eyebrows type-c threaded
	-added eyebrows type-c natural
	-added eyebrows type-c tapered
	-added eyebrows type-c thick
	-added eyebrows type-c bushy

v1.1 (07-11-2018)
-------------
	-added torso chubby
	-added torso fat
	-added torso obese
	-added butt enormous
	-added butt gigantic
	-added butt massive
	-added legs thick
	-added butt outfits enormous (x56)
	-added butt outfits gigantic (x56)
	-added butt outfits massive (x56)
	-fixed crotch coloring for dicks on dirndl
	-fixed crotch coloring for dicks on lederhosen
	-fixed crotch coloring for dicks on battlearmor
	-fixed crotch coloring for dicks on mounty outfit
	-fixed crotch coloring for dicks on long qipao
	-fixed crotch coloring for dicks on biyelgee costume
	-added leg outfits thick (x56)

v1.0 (07-03-2018)
-------------
	-added long qipao outfit
	-added battlearmor outfit
	-added mounty outfit
	-added dirndl outfit
	-added lederhosen outfit
	-added biyelgee costume outfit
	-added tiny nipple art
	-added cute nipple art
	-added puffy nipple art
	-added inverted nipple art
	-added huge nipple art
	-added fuckable nipple art
	-added partially inverted nipple art

v0.9 (05-05-2018)
-------------
	-added dynamic belly scaling (courtesy of @prndev)
	-added belly button art
	-fixed belly piercings not showing
	-updated belly piercing art
	-added belly outfit apron
	-added belly outfit bodysuit
	-added belly outfit cheerleader
	-added belly outfit clubslut
	-added belly outfit cutoffs (base only)
	-added belly outfit cybersuit
	-added belly outfit fallen nun (base only)
	-added belly outfit haltertop dress
	-added belly outfit hijab and ayaba
	-added belly outfit latex catsuit
	-added belly outfit leotard
	-added belly outfit nice maid
	-added belly outfit slutty maid
	-added belly outfit military (base only)
	-added belly outfit minidress
	-added belly outfit monokini (base only)
	-added belly outfit nice nurse
	-added belly outfit slutty nurse (base only)
	-added belly outfit red army uniform (base only)
	-added belly outfit schoolgirl (base only)
	-added belly outfit schutzstaffel (base only)
	-added belly outfit silken ballgown
	-added belly outfit skimpy battldress (base only)
	-added belly outfit slave gown
	-added belly outfit spats and a tank top (base only)
	-added belly outfit succubus (base only)
	-added belly outfit suit nice (base only)
	-added belly outfit suit slutty (base only)
	-added belly outfit bunny outfit
	-added belly outfit chattel habit (base only)
	-added belly outfit conservative clothing (base only)
	-added belly outfit harem gauze (base only)
	-added belly outfit huipil
	-added belly outfit kimono (base only)
	-added belly outfit maternity dress
	-added belly outfit slutty qipao
	-added belly outfit toga
	-added belly outfit western clothing
	-added belly outfit penitent nun (base only)
	-added belly outfit restrictive latex
	-added freckles as misc facial feature
	-added heavy freckles as misc facial feature
	-added beauty mark as misc facial feature
	-added birthmark as misc facial feature
	-minor outfit polishing on some outfits
	-polished outlines on torso art (normal, narrow, absurd)
	-reworked naked apron outfit
	-updated bangles outfit
	-fixed problems when surgically altering a slave's race
	-reworked clubslut netting outfit
	-updated cheerleader outfit
	-added AI personal assistant art
	-added blue-violet hair color
	-updated deep red hair color
	-added shaved armpit hair
	-added neat armpit hair
	-added bushy armpit hair
	-fixed male genitalia showing over large bellies
	-added porcelain mask accessory
	-added ability to custom color porcelain mask
	-added ability to custom color glasses
	-added slutty schutzstaffel uniform

v0.8 (04-21-2018)
-------------
	-added wispy pubic hair
	-added areola normal art
	-added areola large art
	-added areola wide art
	-added areola huge art
	-added areola star-shaped art
	-added areola heart-shaped art
	-converted stockings to a leg accessory
	-fixed issue that allowed stockings to be shown/selected on amputees
	-added visor hat to military outfit (per request)
	-fixed tilted neat pubic hair
	-fixed bellies/corsets showing at the same time if present/selected
	-major overhaul of skin tones
	-tweaked leg/hipsize/weight art distribution
	-fixed vaginal piercings not showing
	-updated vaginal piercing art
	-created porcelain mask accessory art
	-added cybersuit outfit
	-added skin/nipple tones for every race (courtesy of skinAnon)
	-added naked apron outfit
	-added schutzstaffel uniform
	-added red army uniform
	-darkened stocking art slightly (per request)

v0.7 (04-14-2018)
-------------
	-added sleeves to hijab and abaya outfit
	-added sleeves to cutoffs and a t-shirt outfit
	-added sleeves to skimpy battledress outfit
	-added sleeves to conservative outfit
	-added sleeves to huipil outfit
	-added sleeves to kimono outfit
	-added sleeves to nice maid outfit
	-added sleeves to military uniform outfit
	-added sleeves to nice nurse outfit
	-added sleeves to slutty nurse outfit
	-added sleeves to slutty qipao outfit
	-added sleeves to schoolgirl outfit
	-added sleeves to nice suit outfit
	-added sleeves to slutty suit outfit
	-added sleeves to western clothing outfit
	-removed thigh-highs/stockings on most outfits
	-fixed nipple piercings showing incorrectly
	-fixed boots showing incorrectly on some outfits
	-fixed 'invisible balls' on one of the scrotum sizes (the shadow was showing as skin color, removing the outline)
	-slutty nurse outfit now better matches the description
	-updated thigh boot art
	-updated extreme heel art
	-added bare feet stocking outfits (Long/short)
	-added additional flat shoe outfits (bare/stockings short/stockings long)
	-added additional heel shoe outfits (bare/stockings short/stockings long)
	-added additional pump shoe outfits (bare/stockings short/stockings long)

v0.6 (04-07-2018)
-------------
	-fixed bodysuit outfit color issue on non-default colors
	-fixed restrictive latex color issue on non-default colors
	-added hairstyle 'messy bun' (long/medium/short)
	-added hairstyle 'dreadlocks' (long/medium/short)
	-added hairstyle 'cornrows' (long/medium/short)
	-added hairstyle 'braided' (long/medium/short)
	-added hairstyle 'twintails' (long/medium/short)
	-added hairstyle 'shavedsides' (long/medium/short)
	-added chains outfit
	-added penitent nun outfit
	-reworked male genitalia
	-added bulge outfits for the appropriate outfits
	-removed transparency on clubslut, harem, and slutty torso outfits due to multiple issues
	-overhauled clubslut outfit to fix numerous art issues.
	-changed extreme heels
	-changed thigh high boots
	-overhauled breasts
	-reworked all breast outfits due to breast overhauled
	-changed breast positioning relative to the overall body
	-reworked corset lengths
	-reworked all breast and torso outfits for new breast compatibility

v0.5 (03-31-2018)
-------------
	-added belly scaling w/pregnancy+overfeeding
	-minor polishing on all outfits
	-fixed piercings not showing correctly
	-added nipple light piercings
	-added areola light piercings
	-added nipple heavy piercings
	-added areola heavy piercings
	-added vaginal dildo accessory
	-added vaginal long dildo accessory
	-added vaginal large dildo accessory
	-added vaginal long, large dildo accessory
	-added vaginal huge dildo accessory
	-added vaginal long, huge dildo accessory
	-added anal long plug accessory
	-added anal large plug accessory
	-added anal long, large plug accessory
	-added anal huge plug accessory
	-added anal long, huge accessory
	-added anal tail plug accessory (anal hook/bunny tail)
	-added first trimester pregnancy empathy belly
	-added second trimester pregnancy empathy belly
	-added third trimester pregnancy empathy belly
	-added third trimester twin pregnancy empathy belly
	-added tight corset torso accessory
	-added extreme corset torso accessory
	-cleaned up changelog wording for clarity purposes
	-added uncomfortable leather collar outfit
	-updated dildo gag collar graphic art
	-added massive dildo gag collar outfit
	-added ball gag collar outfit
	-added bit gag collar outfit
	-added silken ribbon collar outfit
	-added bowtie collar outfit
	-added ancient egyptian collar outfit
	-added hairstyle 'neat' (long/medium/short)
	-added hairstyle 'up' (long/medium/short)
	-added hairstyle 'ponytail' (long/medium/short)
	-added hairstyle 'bun' (long/medium/short)
	-added hairstyle 'curled' (long/medium/short)
	-added hairstyle 'messy' (long/medium/short)
	-added hairstyle 'permed' (long/medium/short)
	-added hairstyle 'eary' (long/medium/short)
	-added hairstyle 'luxurious' (long/medium/short)
	-added hairstyle 'afro' (long/medium/short)
	-fixed cowboy hat not showing on western outfit
	-fixed baldness on generic/generated non-selectable hairstyles

v0.4 (03-24-2018)
-------------
	-added nice lingerie outfit
	-fixed immersion breaking art on specific flat-chested outfits (somewhat)
	-added nurse slutty outfit
	-added silken ballgown outfit
	-added skimpy battledress outfit
	-minor polishing on all outfits
	-added slutty outfit
	-added spats and a tank top outfit
	-fixed graphical issues on mini dress
	-added succubus outfit
	-added nice suit outfit
	-added slutty suit outfit
	-added attractive lingerie for a pregnant woman outfit
	-added bunny outfit
	-added chattel habit outfit
	-updated fallen nun outfit (headdress added)
	-added conservative clothing outfit
	-added harem gauze outfit
	-added huipil outfit
	-added kimono outfit
	-added slave gown outfit
	-added stretch pants and a crop top outfit
	-updated schoolgirl outfit (sweater vest added)
	-added slutty qipao outfit
	-added toga outfit
	-added western clothing outfit (no cowboy hat)
	-fixed dick/ball clipping issues on all relevant outfits
	-added natural color nipples to match racial skin tones

v0.3 (03-17-2018)
-------------
	-added schoolgirl outfit
	-added fallennun outfit
	-added nice maid outfit
	-added slutty maid outfit
	-updated minidress outfit (changed color+fixes)
	-minor polishing on some outfits
	-added niqab and abaya outfit (niqab > hijab)
	-changed white colors on outfits to grey for increased contrast on light skin tones.
	-added nice nurse outfit
	-fixed outline issues on boots/extreme heels
	-fixed ultra black hair color issue (vanilla only)
	-added military uniform outfit
	-updated to latest pregmod git

v0.2 (03-10-2018)
-------------

	-added string bikini outfit
	-added scalemail bikini outfit
	-updated male genitalia display position
	-set default shoe colors to neutral (per request)
	-added some natural color nipples to match racial skin tones

v0.1 (03-03-2018)
-------------
	-updated boob graphic art
	-updated nipple graphic art
	-updated arm graphic art
	-updated female genitalia graphic art
	-updated waist graphic art
	-updated butt graphic art
	-added bushy pubic hair
	-added very bushy pubic hair
	-updated vaginal chastity belt
	-updated anal chastity belt
	-added uncomfortable strap outfit
	-added shibari rope outfit
	-updated restrictive latex outfit
	-updated latex catsuit outfit
	-updated extreme heel graphic art
	-updated pump shoes graphic art (not selectable in-game yet)
	-added bodysuit outfit
	-added body oil outfit
	-added haltertop dress outfit
	-added bangles outfit
	-added mini dress outfit
	-added leotard outfit
	-added t-shirt and cutoffs outfit
	-added cheerleader outfit
	-added clubslut netting outfit